当我使用 Amazon Simple Storage Service (Amazon S3) 事件通知添加通知配置时,我收到“Unable to validate the following destination configurations when creating an Amazon S3 Event Notification”(创建 Amazon S3 事件通知时无法验证以下目标配置)错误消息。我想排查并解决此问题。
简短描述
为防止目标配置出现验证问题,请执行以下操作:
- 指定的目标必须具有基于资源的策略,以允许 Amazon S3 向目标发布通知。
- 目标的 AWS 区域必须与 S3 存储桶的区域相同。
- 如果目标使用 AWS Key Management Service(AWS KMS)密钥进行加密,则密钥策略必须允许访问 S3。
如果您更新事件通知配置,则 Amazon S3 会验证所有事件目标是否存在。S3 还会检查事件目标是否具有基于资源的策略,这些策略允许 S3 根据事件目标类型执行以下操作:
S3 会对新事件目标和更新期间未删除的所有现有事件目标执行这些检查。当检查失败时,您可能会收到“Unable to validate the following destination configurations”(无法验证以下目标配置)错误。
解决方法
运行 AWSSupport-TroubleshootS3EventNotifications 自动化运行手册
最佳做法是,使用 AWSSupport-TroubleshootS3EventNotifications 对添加事件通知配置时出现的常见问题进行故障排除。
注意:
- 仅当存储桶所有者与运行自动化操作的 AWS 账户所有者相同时,运行手册才能评估事件通知配置。
- 运行手册无法评估托管在另一个账户中的目标资源上的策略。
要运行自动化,请完成以下步骤:
- 打开 AWS Systems Manager 控制台,然后打开 AWSSupport-TroubleshootS3EventNotifications。
- 选择 Execute automation(执行自动化)。
- 输入您的输入参数。
- 选择 Execute(执行)。
- 在 Outputs(输出)部分中查看结果。
最终报告中包含使用 S3 存储桶配置为目标事件通知的资源。如果您仍然遇到 Amazon S3 事件通知问题,请使用以下解决方法手动对问题进行故障排除。
删除已不存在的目标的事件
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
如果您现有的事件通知将事件发送到已不存在的目标,请在更新事件通知配置之前删除这些事件。存储桶上可能有此通知,但目标不存在,因为您在更新事件通知配置后将其删除了。
您可以使用 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 函数。
如果您使用 S3 控制台启用事件通知,则 S3 会在您将策略添加到事件之前尝试更新策略。如果事件目标的基于资源的策略有效,但您仍收到相同的错误,请检查所有现有的事件目标是否具有基于资源的有效策略。如果您在更新存储桶上的事件通知配置后修改了事件目标的基于资源的策略,则验证将失败。为防止出现此问题,请确保所有权限均有效,并删除目标无效的事件。
确保用于 AWS KMS 加密主题和队列的 AWS KMS 密钥策略正确
如果您为 SQS 或 SNS 目标激活 AWS KMS 加密,请更新客户自主管理型密钥策略以允许 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": "*"
}
]
}
相关信息
目标 SNS 主题的 AWS Identity and Access Management (IAM) 策略
目标 SQS 队列的 IAM 策略