发送给 KMS_MANAGED 加密 SQS 队列(在 CDK 中)的 S3 事件通知不起作用

CC.*_*CC. 1 amazon-s3 amazon-sqs amazon-web-services amazon-kms aws-cdk

我有一个使用 CDK 开发的架构,其中包含 S3 存储桶和事件通知,该通知将针对每个上传到 S3 的文件向 SQS 发送一条消息。

效果很好。

现在我正在尝试激活加密,并且我有以下内容:

  • 对于 S3 -> 我已使用 S3_MANAGED 密钥激活加密,一切正常
  • 对于 SQS -> 我已使用 KMS_MANAGED 密钥激活加密,并且没有消息发送到 SQS

所以我假设缺少一些权限,但我不知道如何修复它。

我是否需要向 SQS 添加缺少的权限才能从 S3 读取数据?或者 S3 是否有权将消息发送到加密的 SQS?

fed*_*nev 5

TL;DR S3 通知不适用于sqs.QueueEncryption.KMS_MANAGED. 使用客户管理的密钥来加密队列。

\n

AWS 知识库:为什么 \xe2\x80\x99t Amazon S3 事件通知传送到使用服务器端加密的 Amazon SQS 队列?:

\n
\n

无法修改默认的 AWS 托管 KMS 密钥。您必须使用客户管理的密钥...并向 KMS 密钥添加权限以允许访问指定的服务主体。

\n
\n

这是一个最小的工作示例:

\n
// S3 Notifications to a Encrypted Queue\nexport class S3SqsStack extends cdk.Stack {\n  constructor(scope: Construct, id: string, props: cdk.StackProps) {\n    super(scope, id, props);\n\n    const bucket = new s3.Bucket(this, \'MyBucket\', {\n      encryption: s3.BucketEncryption.S3_MANAGED,\n    });\n\n    // https://aws.amazon.com/premiumsupport/knowledge-center/sqs-s3-event-notification-sse/\n    const key = new kms.Key(this, \'MyCustomerKey\', {\n      policy: new iam.PolicyDocument({\n        statements: [\n          new iam.PolicyStatement({\n            actions: [\'kms:GenerateDataKey\', \'kms:Decrypt\'],\n            resources: [\'*\'], // avoid circularity by not limiting the resource\n            principals: [new iam.ServicePrincipal(\'s3.amazonaws.com\')],\n          }),\n        ],\n      }),\n    });\n\n    const queue = new sqs.Queue(this, \'MyQueue\', {\n      encryption: sqs.QueueEncryption.KMS,\n      encryptionMasterKey: key,\n    });\n\n    bucket.addEventNotification(s3.EventType.OBJECT_CREATED, new s3n.SqsDestination(queue));\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n