Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
当我将 Amazon S3 事件通知与通用存储桶配合使用时,为什么会收到 "Unable to validate the following destination configurations" 错误?
当我使用 Amazon Simple Storage Service (Amazon S3) 事件通知添加通知配置时,我收到 "Unable to validate the following destination configurations when creating an Amazon S3 Event Notification" 错误消息。我想排查并解决此问题。
解决方法
如果您添加或更新事件通知配置,则 Amazon S3 会验证所有事件目标是否存在。Amazon S3 还会检查事件目标是否具有基于资源的策略,这些策略允许 Amazon S3 执行以下操作:
- 发布事件
- 发送消息
- 调用函数
在更新期间,Amazon S3 会对新事件目标和更新期间未删除的所有现有事件目标执行这些检查。当检查失败时,您可能会收到 "Unable to validate the following destination configurations" 错误。
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
注意: 只有通用存储桶才支持事件通知。目录存储桶和表存储桶不支持事件通知。如果您需要事件通知功能,请使用通用存储桶。
运行 AWSSupport-TroubleshootS3EventNotifications 自动化运行手册
最佳做法是,使用 AWSSupport-TroubleshootS3EventNotifications 对添加事件通知配置时出现的问题进行故障排除。
注意:
- 仅当存储桶所有者同时拥有运行自动化的 AWS 账户时,运行手册才能评估事件通知配置。
- 运行手册无法评估托管在另一个账户中的目标资源上的策略。
要运行自动化,请完成以下步骤:
- 打开 AWS Systems Manager 控制台,然后打开 AWSSupport-TroubleshootS3EventNotifications。
- 选择 Execute automation(执行自动化)。
- 输入您的输入参数。
- 选择 Execute(执行)。
- 在 Outputs(输出)部分中查看结果。
最终报告中包含使用 S3 存储桶配置为目标事件通知的资源。如果您仍然遇到 S3 事件通知问题,请使用以下解决方法手动对问题进行故障排除。
删除已不存在的目标的事件
当 S3 事件通知的目标不再存在时,您需要删除这些通知的配置。例如,当您删除诸如 Lambda 函数之类的目标时,请将其事件通知设置从您的通用存储桶中删除。您可以通过 Amazon S3 控制台、AWS CLI 或 PutBucketNotificationConfiguration API 删除过时的事件通知。建议您使用 PutBucketNotificationConfiguration API 来管理所有事件通知。
确认事件目标具有基于资源的有效策略
要向以下 AWS 服务发布消息,请向 Amazon S3 授予必要的权限,以调用相关 API:
- Amazon Simple Notification Service (Amazon SNS) 主题
- Amazon Simple Queue Service (Amazon SQS) 队列
- AWS Lambda 函数
Amazon SNS 主题目标策略示例:
{ "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "Example SNS topic policy", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SNS:Publish" ], "Resource": "SNS-topic-ARN", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:bucket-name" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
Amazon SQS 队列目标策略示例:
{ "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "SQS:SendMessage" ], "Resource": "arn:aws:sqs:Region:account-id:queue-name", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:s3:*:*:awsexamplebucket1" }, "StringEquals": { "aws:SourceAccount": "bucket-owner-account-id" } } } ] }
Lambda 函数目标策略示例:
{ "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "s3invoke", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:Region:account-id:function:function-name", "Condition": { "StringEquals": { "AWS:SourceAccount": "bucket-owner-account-id" }, "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::awsexamplebucket1" } } } ] }
如果您向存储桶添加新事件,请确保新事件具有基于资源的有效策略。
有关 Amazon SNS 或 Amazon SQS 权限的详细信息,请参阅授予将消息发布到 SNS 主题或 SQS 队列的权限。
要使用有效策略更新 Lambda 函数,请参阅教程: 使用 Amazon S3 触发器调用 Lambda 函数。
如果您使用 Amazon S3 控制台启用事件通知,则 Amazon S3 会在您将策略添加到事件之前尝试更新策略。如果事件目标的基于资源的策略有效,但您仍收到相同的错误,请检查事件目标是否具有基于资源的有效策略。如果您在更新存储桶上的事件通知配置后修改了事件目标的基于资源的策略,则验证将失败。为防止出现此问题,请确保所有权限均有效,并删除目标无效的事件。
确保用于 AWS KMS 加密主题和队列的 AWS KMS 密钥策略正确无误
如果您为 SQS 或 SNS 目标激活了 AWS Key Management Service (AWS KMS) 加密,请更新客户管理型密钥策略以允许 Amazon S3 使用该密钥。
不支持 AWS 托管式密钥,例如 aws/sns 和 aws/sqs。如果您对事件目标使用 AWS 托管式密钥,则必须更新目标才能使用客户管理型密钥。然后,更新密钥策略。
AWS KMS 密钥策略示例:
{ "Version": "2012-10-17", "Id": "example-ID", "Statement": [ { "Sid": "example-statement-ID", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "*" } ] }
