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

Posted

技术标签:

【中文标题】到 KMS_MANAGED 加密 SQS 队列(在 CDK 中)的 S3 事件通知不起作用【英文标题】:S3 Event notification to KMS_MANAGED encrypted SQS queue (in CDK) not working 【发布时间】:2022-01-14 03:55:04 【问题描述】:

我有一个使用 CDK 开发的架构,带有一个 S3 存储桶和一个事件通知,它将为每个上传到 S3 的文件向 SQS 发送一条消息。

效果很好。

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

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

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

是否需要向 SQS 添加缺少的权限才能从 S3 读取?还是允许 S3 向加密的 SQS 发送消息?

【问题讨论】:

【参考方案1】:

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

AWS Knowledge Base: Why aren’t Amazon S3 event notifications delivered to an Amazon SQS queue that uses server-side encryption?:

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

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

// S3 Notifications to a Encrypted Queue
export class S3SqsStack extends cdk.Stack 
  constructor(scope: Construct, id: string, props: cdk.StackProps) 
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'MyBucket', 
      encryption: s3.BucketEncryption.S3_MANAGED,
    );

    // https://aws.amazon.com/premiumsupport/knowledge-center/sqs-s3-event-notification-sse/
    const key = new kms.Key(this, 'MyCustomerKey', 
      policy: new iam.PolicyDocument(
        statements: [
          new iam.PolicyStatement(
            actions: ['kms:GenerateDataKey', 'kms:Decrypt'],
            resources: ['*'], // avoid circularity by not limiting the resource
            principals: [new iam.ServicePrincipal('s3.amazonaws.com')],
          ),
        ],
      ),
    );

    const queue = new sqs.Queue(this, 'MyQueue', 
      encryption: sqs.QueueEncryption.KMS,
      encryptionMasterKey: key,
    );

    bucket.addEventNotification(s3.EventType.OBJECT_CREATED, new s3n.SqsDestination(queue));
  

【讨论】:

以上是关于到 KMS_MANAGED 加密 SQS 队列(在 CDK 中)的 S3 事件通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章

正确计算发送到死信 SQS 队列的消息数

从 AWS Lambda 读取 SQS 队列

Amazon SQS 延迟队列

AWS SQS:当消费者发生错误时移动到死信队列

如何将 SQS 队列订阅到 Java 中的 SNS 主题

Amazon SQS 消息队列服务