s3bucketnotifications 不适用于 localstack 和 docker

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

我的情况是这样的: 有一个 xml 通过预签名的 URL 上传到 Amazon S3。 文件上传到 S3 后,我们希望 SQS 队列通过 S3 事件通知了解情况。 一旦 SQS 队列收到这个新事件,我们希望触发 Lambda 函数。

我正在尝试使用 Docker 中的 localstack 来运行这个流程。我的存储桶、SQS 队列和 Lambda(MyLambdaFunction 和我的存储桶通知处理程序)已创建。然而,当我有效上传到 S3 时,文件并没有经历整个流程。一旦它进入 S3,就不会发生任何其他事情。我究竟做错了什么? 我没有 localstack PRO 版本。

这是我的 AWS CDK 项目的代码: 在我的 /bin 文件夹中,我有一个 test.js 文件:

#!/usr/bin/env node
const cdk = require('aws-cdk-lib');
const { TestStack } = require('../lib/test-stack');
const app = new cdk.App();
new TestStack(app, 'TestStack');

在我的 /lib 文件夹中,我有一个 test-stack.js 文件:

const cdk = require("aws-cdk-lib");
const sqs = require("aws-cdk-lib/aws-sqs");
const s3 = require("aws-cdk-lib/aws-s3");
const lambda = require("aws-cdk-lib/aws-lambda");
const s3Notifications = require("aws-cdk-lib/aws-s3-notifications");
const { SqsEventSource } = require("aws-cdk-lib/aws-lambda-event-sources");

class TestStack extends cdk.Stack {
  /**
   * @param {cdk.App} scope
   * @param {string} id
   * @param {cdk.StackProps=} props
   */
  constructor(scope, id, props) {
    super(scope, id, props);

    // S3 bucket
    const bucket = new s3.Bucket(this, "MyBucket", {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    // SQS queue
    const queue = new sqs.Queue(this, "MyQueue", {
      visibilityTimeout: cdk.Duration.seconds(300),
    });

    // Lambda function
    const lambdaFunction = new lambda.Function(this, "MyLambdaFunction", {
      runtime: lambda.Runtime.NODEJS_18_X,
      handler: "lambda.handler",
      code: lambda.Code.fromAsset("lib/lambda"),
      environment: {
        QUEUE_URL: queue.queueUrl,
      },
    });

    // Set up S3 event notification to trigger SQS
    bucket.addEventNotification(
      s3.EventType.OBJECT_CREATED,
      new s3Notifications.SqsDestination(queue),
    );

    // Set up SQS event source for Lambda function
    lambdaFunction.addEventSource(new SqsEventSource(queue));
  }
}

我的 docker-compose.yml 文件如下所示:

version: "3.8"

services:
  localstack:
    image: localstack/localstack:3.2.0
    network_mode: bridge
    ports:
      - "4566:4566"
      - "4571:4571"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./localstack:/etc/localstack/init/ready.d

我在cmd中执行以下命令:

docker-compose up -d 
cdklocal bootstrap
cdklocal deploy 

amazon-web-services amazon-s3 lambda amazon-sqs localstack
1个回答
0
投票

这是 CDK 的限制,它创建一个 CustomResource 用于将 S3 通知添加到您的存储桶,这是 LocalStack Pro 的一项功能。您可以通过直接访问 L1 构造来设置配置来使用解决方法:

    const bucket = new s3.Bucket(...);
    const lambda = new NodejsFunction(...);
    if (isDeployingToLocalStack()) { // implement or replace `isDeployingToLocalStack()` as required
      const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
      cfnBucket.notificationConfiguration = {
        lambdaConfigurations: [
          {
            creationStack: [],
            event: 's3:ObjectCreated:*',
            function: lambda.functionArn,
          },
        ],
      };
    }

此解决方案在 LocalStack GitHub 问题上给出:https://github.com/localstack/localstack/issues/9352#issuecomment-1862125662

© www.soinside.com 2019 - 2024. All rights reserved.