CDK - Notification S3 provoquant une erreur de référence cyclique

Nov 01 2020

Je veux créer un compartiment S3 dans une pile, le passer dans une autre, puis l'utiliser pour créer une notification sur un sns ou un sqs. Voici un exemple de code en panne ressemblant à.

pile 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
}

pile 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));

L'erreur est 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.

Réponses

1 mchlfchr Nov 02 2020 at 12:00

Le message d'erreur indique que vous utilisez un Lambda.

Où est cette définition de Lamdba?

Qu'essayez-vous de faire avec SNS?

Je suppose que vous vouliez appliquer le modèle (S3 PUT -> Notification -> Lambda) parce que vous n'avez pas publié le code complet (y compris le Lambda) lui-même.

En partant de mon hypothèse, laissez-moi vous montrer le problème auquel vous êtes actuellement confronté:

Plain Cloud Formation, qui est utilisé sous le capot avec CDK, ne peut pas résoudre cela par lui-même et vous auriez besoin de créer une ressource personnalisée pour résoudre ce problème. AWS CDK peut cependant résoudre ce problème, car il crée automatiquement la ressource personnalisée requise et la séquence de création correcte!

Au lieu d'utiliser le s3n.SnsDestination, utilisez la destination Lambda comme indiqué dans l'extrait de code. Vous pouvez facilement tout extraire dans des piles séparées, car le problème ne devrait pas être lié à la séparation des piles.

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));
  }
}

Faites-moi savoir si cela répond à votre question ou si vous rencontrez des problèmes.