为什么 Amazon S3 事件通知未传输到使用服务器端加密的 Amazon SQS 队列?

2 分钟阅读
0

Amazon Simple Storage Service(Amazon S3)事件通知未传输到服务器端加密(SSE)的 Amazon Simple Queue Service(Amazon SQS)队列。

解决方案

完成这些步骤,配置并向使用服务器端加密(SSE)的 Amazon SQS 队列发送 S3 事件通知。

创建客户管理的 AWS KMS 密钥并配置密钥政策

您必须使用客户管理的 AWS Key Management Service(AWS KMS)密钥加密 Amazon SQS 队列。然后,向 Amazon S3 服务主体授予使用加密队列的权限。

**注意:**您无法修改默认 AWS 托管 KMS 密钥。作为替代,您必须使用客户管理的密钥来完成此过程。您还必须向 AWS KMS 密钥添加权限,以允许访问指定的服务主体。

要授予 Amazon S3 服务主体权限,请在客户管理型密钥政策中添加这条语句:

{  "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": "*"
    },
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::"111122223333":root"
      },
      "Action": "kms:*",
      "Resource": "*"
    }
  ]
}

**注意:**用您的 ARN 替换 "arn:aws:iam::"111122223333":root"

创建 SQS 队列并授予 Amazon S3 权限

  1. 创建配置为使用 SSE 的 Amazon SQS 队列。有关详细信息,请参阅Configuring server-side encryption (SSE) for a queue (console)
  2. 要允许 Amazon S3 向队列发送消息,请向 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:us-east-1:111122223333:sqs-s3-kms-same-account",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:s3:*:*:hellobucket"
        }
      }
    }
  ]
}

**注意:**请将 Resource 值替换为您的 SQS 队列 ARN,将 aws:SourceAccount 替换为您的 AWS 源账户 ID,以及将 aws:SourceArn 替换为您的 Amazon S3 桶 ARN。

在前面的示例中,客户账户 123456789 的 S3 桶 hellobucket 可以向指定的 SQS 队列发送 ObjectCreated 事件通知。有关使用加密的 SQS 队列所需权限的详细信息,请参阅Key management

创建 S3 事件

要为桶添加 Amazon S3 事件,请完成这些步骤:

  1. 打开 S3 控制台,然后为 S3 桶选择带超链接的名称
  2. 属性选项卡中,选择创建事件通知
  3. 创建事件通知页面上,输入以下信息:
    对于事件名称,输入名称。
    对于事件类型,选择要接收通知的事件类型。
    对于目标,选择 SQS 队列
    对于 SQS 队列,选择您的队列。
  4. 选择保存更改

确认您的 Amazon S3 事件类型配置正确

在配置 Amazon S3 事件通知时,必须指定支持的事件类型以使 Amazon S3 发送通知。如果您的 Amazon S3 桶中出现了未指定的事件类型,则 Amazon S3 不会发送通知。

确认您的对象键名称过滤器采用 URL 编码格式

如果将事件通知配置为使用对象键名称筛选,则仅针对具有特定前缀或后缀的对象发布通知。

如果您在前缀或后缀中使用特殊字符,则必须以 URL 编码格式输入这些字符。有关更多信息,请参阅使用对象键名称筛选配置事件通知

**注意:**不能使用通配符(“*”)作为前缀或后缀来表示过滤器中的任何字符。

检查所有事件目标是否都存在

当 Amazon S3 事件通知桶目标不存在时,会出现“Unable to validate the following destination configurations”错误。

如果您配置的事件通知将事件发送到已不存在的目标,则必须删除这些事件。在更新事件通知配置之前,请务必删除这些事件。

**注意:**最佳实践是使用 PutBucketNotificationConfiguration API 删除所有目标不存在的事件。

检查 S3 桶和 SQS 队列区域

您无法将通知从一个 AWS 区域的 S3 桶发送到另一个区域的 Amazon SQS 队列。作为替代,如果 S3 桶目标是位于其他区域的 Amazon SQS 队列,请设置一个 Amazon Simple Notification Service(Amazon SNS)主题作为桶目标。Amazon SNS 支持跨区域向 Amazon SQS 队列和 AWS Lambda 函数发送通知。

有关更多信息,请参阅将 Amazon SNS 消息发送到不同区域中的 Amazon SQS 队列或 AWS Lambda 函数

确认消息已发送到 Amazon SQS 队列

使用 Amazon CloudWatch NumberOfMessagesSent 指标来检查消息是否已发送到 Amazon SQS 队列。

有关更多信息,请参阅Why is my Amazon SQS queue not receiving messages?

联系 AWS Support 进行故障排除

如果上述故障排除步骤无法解决您的问题,请联系 AWS Support。在您的邮件中提供失败的 API 调用的 RequestId 和带有时区时间戳

相关信息

如何让我的 Amazon SQS 订阅成功收到来自我的 Amazon SNS 主题的通知?

Amazon S3 事件通知

演练: 为通知配置桶(SNS 主题或 SQS 队列)

AWS 官方
AWS 官方已更新 6 个月前