Уведомление CDK — S3, вызывающее циклическую ошибку ссылки

#typescript #amazon-web-services #amazon-s3 #amazon-cloudformation #aws-cdk

#typescript #amazon-веб-сервисы #amazon-s3 #aws-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:

Сообщение об ошибке указывает на то, что вы используете лямбда-выражение.

Где это определение Lamdba?

Что вы пытаетесь сделать с SNS?

Я предполагаю, что вы хотели применить шаблон (S3 PUT -> Notification -> Lambda), потому что вы не опубликовали полный код (включая саму лямбду).

Исходя из моего предположения, позвольте мне показать вам проблему, с которой вы сейчас сталкиваетесь: Циклическая зависимость между сегментом и лямбда (роль)

Простое формирование облака, которое используется под капотом с CDK, не может решить эту проблему само по себе, и вам потребуется создать пользовательский ресурс для решения этой проблемы. Однако AWS CDK может решить эту проблему, поскольку он автоматически создает необходимый пользовательский ресурс и правильную последовательность создания!

Вместо использования 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));
  }
}

  

Дайте мне знать, если это отвечает на ваш вопрос или если у вас возникли какие-либо проблемы.

Комментарии:

1. Думаю, это связано с ошибкой в коде CDK, проверьте проблему здесь github.com/aws/aws-cdk/issues/11245 Кажется, это решено с помощью Lambda destination, как я вижу, они устранили аналогичную ошибку здесь github.com/aws/aws-cdk/issues/5760

2. Я все равно приму ответ, поскольку это единственное жизнеспособное решение проблемы на данный момент, что хорошо документировано.