#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 с добавлением событий и выполнять их самостоятельно, пытаясь избежать циклической зависимости.