Круговая ссылка при использовании новых s3notifications.Ламбдадестинация в cdk

#aws-cdk

Вопрос:

Я сталкиваюсь с циклической проблемой с этим

 props.incomingBucket.addEventNotification(EventType.OBJECT_CREATED, new s3notifications.LambdaDestination(this.incomingHandler));
 

Это ошибка, которую я получаю:

выдать новую ошибку( '${target.node.path}' depends on '${this.node.path}' (${cycle.join(', ')}). Adding this dependency (${reason}) would create a cyclic reference. );

У меня есть incomingBucket в стеке A, а incomingHandler в стеке B, это props.incomingBucket.addEventNotification(EventType.OBJECT_CREATED, new s3notifications.LambdaDestination(this.incomingHandler)); в стеке B, но он сталкивается с этой проблемой. Тем не менее, props.incomingBucket.grantReadWrite(this.incomingHandler); у этого нет проблем, поэтому я не совсем уверен, что происходит…

Это моя полная стопка:

 export interface LambdaProps {
    readonly env: DeploymentEnvironment;
    readonly stackName?: string;
    readonly stage: string;
    readonly vpc: EC2Vpc;
    readonly incomingBucket: Bucket;
    readonly blobsBucket: Bucket;
    readonly blobsTable: Table;
    readonly identExtractor: Extractor;
}

export class LambdaStack extends DeploymentStack {

    public readonly apiLambda: IFunction;
    public readonly dropboxLambda: IFunction;
    public readonly incomingHandler: IFunction;

    constructor(parent: core.App, name: string, props: LambdaProps) {
        super(parent, name, {
            softwareType: SoftwareType.INFRASTRUCTURE,
            ...props
        });

        this.incomingHandler = new Function(this, "IncomingHandler", {
            code: .... stuff here,
            handler: 'handlers.incoming_lambda',
            runtime: Runtime.PYTHON_3_7,
            timeout: core.Duration.seconds(30),
            environment: {
                .... stuff here
            }
        });

        // // new blobs in the incoming bucket trigger lambda event
        // TODO ok this is causing a circular issue, need to figure out how to fix 
        props.incomingBucket.addEventNotification(EventType.OBJECT_CREATED, new s3notifications.LambdaDestination(this.incomingHandler));

        // grant permissions to the incoming lambda.
        props.incomingBucket.grantReadWrite(this.incomingHandler);
        props.blobsBucket.grantReadWrite(this.incomingHandler);
        props.blobsTable.grantReadWriteData(this.incomingHandler);

        props.identExtractor.taskQueue.grantSendMessages(this.incomingHandler);
    }
}
 

Ответ №1:

На основе https://github.com/aws/aws-cdk/issues/5760 существовала проблема циклической зависимости.

На основе https://github.com/aws/aws-cdk/pull/10426 это было решено таким образом, что ведро зависит от лямбды. Я предполагаю, что вам нужно одинаково изменить свой код — ввести лямбду в стек ведра вместо того, чтобы вводить ведро в стек лямбды.

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

1. Да, я думал, что это решено, но… не похоже на это?

2. К сожалению, я не могу ввести лямбду в стек ведра, потому что это вызовет проблему циклического импорта lol. Для лямбда — стека требуется ведро с ведром.

3. Это прискорбно. Я предполагаю, что затем вы можете «перепроектировать» действия CDK с добавлением событий и выполнять их самостоятельно, пытаясь избежать циклической зависимости.