CDK-S3通知导致循环引用错误

时间:2020-11-01 21:34:54

标签: typescript amazon-web-services amazon-s3 amazon-cloudformation aws-cdk

我想在一个堆栈中创建一个S3存储桶,将其传递到另一个堆栈中,然后使用它在sns或sqs上创建通知。这是一个分解后的代码示例。

堆栈1

export class BucketStack extends BaseStack {

  public readonly mynBucket: Bucket;


  constructor(scope: App, id: string, props?: StackProps) {
    const properties: StackProps = {
      env: {
        region: StackConfiguration.region,
      },
    };
    super(scope, id, properties);
    this.myBucket = this.createMyBucket();
  }


  private createMyBucket() {
   // create and return bucket
}

堆栈2

import * as s3n from '@aws-cdk/aws-s3-notifications';

export class ServiceStack extends BaseStack {
  constructor(scope: App, id: string, myBucket: Bucket) {
    const properties: StackProps = {
      env: {
        region: StackConfiguration.region,
      },
    };

    super(scope, id, properties);

    const topic = new Topic(this, 'Topic');
  
    myBucket.addEventNotification(EventType.OBJECT_CREATED_PUT, new s3n.SnsDestination(topic));

错误是 Error: 'my-bucket-stack' depends on 'my-service-stack' (Depends on Lambda resources., Depends on resources.). Adding this dependency (my-service-stack -> my-bucket-stack/myBucket/Resource.Arn) would create a cyclic reference.

1 个答案:

答案 0 :(得分:1)

该错误消息表明您使用的是Lambda。

Lamdba的定义在哪里?

您打算如何使用SNS?

我假设您想应用该模式(S3 PUT->通知-> Lambda),因为您没有发布完整的代码(包括Lambda)本身。

继续我的假设,让我向您展示当前面临的问题: Circular Dependency between Bucket and Lambda (Role)

与CDK一起使用的普通云形成本身无法解决,因此您需要创建一个自定义资源来解决此问题。 但是,AWS CDK可以解决此问题,因为它会自动创建所需的自定义资源和正确的创建顺序!

使用Lambda Destination而不是使用s3n.SnsDestination,如代码片段所示。您可以轻松地将所有内容提取到单独的堆栈中,因为问题不应该与单独的堆栈有关。

export class TestStack extends Stack {
  constructor(scope: cdk.Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const bucket = new Bucket(this, "your-bucket-construct-id",{
       // ...
    });

     // Lambda
    const lambda = new Function(this, 'the-triggered-lambda', {
      code: Code.asset(path.join(__dirname,  '../src/your-lambda-folder')),
      handler: 'index.handler',
      runtime: Runtime.NODEJS_12_X,
    });

    // S3 -> Lambda
    bucket.addEventNotification(EventType.OBJECT_CREATED_PUT, new LambdaDestination(lambda));
  }
}

如果这是在回答您的问题还是遇到任何问题,请告诉我。

相关问题