AWS CDK 创建 S3 事件通知到 SQS 消息

问题描述 投票:0回答:1

我正在努力创建一种简单的方法来使用 AWS CDK 创建存储桶和 SQS 队列,其中在存储桶中创建的任何对象都将在 SQS 队列中创建消息。我已经能够使其与 AWS CLI 配合使用,但不能与 CDK 配合使用。

我尝试过以下代码:

    /**
     * --------------------------------------------------
     * SQS Queue
     * --------------------------------------------------
     */

    const queue = new sqs.Queue(this, queueName, {
      encryption: sqs.QueueEncryption.UNENCRYPTED,
    });

    queue.grantSendMessages(new iam.ServicePrincipal('s3.amazonaws.com'));

    /**
     * --------------------------------------------------
     * S3 Bucket
     * --------------------------------------------------
     */

    const bucket = new s3.Bucket(this, bucketName, {});

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

    const bucketPolicy = new iam.PolicyStatement({
      actions: ['sqs:SendMessage'],
      effect: iam.Effect.ALLOW,
      principals: [new iam.ServicePrincipal('s3.amazonaws.com')],
      resources: [queue.queueArn],
      conditions: {
        ArnLike: {
          'aws:SourceArn': bucket.bucketArn,
        },
      },
    });

    queue.addToResourcePolicy(bucketPolicy);

这将创建存储桶和队列(在 Localstack 中),但是运行

aws s3 cp ./some_file.txt s3://bucket_name/some_file.txt
不会在 SQS 队列中创建消息。

amazon-web-services amazon-s3 amazon-sqs aws-cdk
1个回答
0
投票

这似乎是 Localstack 的问题(不使用 Pro 时),因此我通过条件检查进行了修复,以查看我是否位于 LS 环境中:

    const bucket = new s3.Bucket(this, bucketName, {
      bucketName,
    });

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

    if (process.env.IS_LOCALSTACK) {
      const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
      cfnBucket.notificationConfiguration = {
        queueConfigurations: [
          {
            event: s3.EventType.OBJECT_CREATED,
            queue: queue.queueArn,
          },
        ],
      };
    }
© www.soinside.com 2019 - 2024. All rights reserved.