如何解决CDK-S3通知导致循环引用错误
我想在一个堆栈中创建一个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,myBucket: Bucket) {
const properties: StackProps = {
env: {
region: StackConfiguration.region,};
super(scope,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.
解决方法
该错误消息表明您使用的是Lambda。
Lamdba的定义在哪里?
您打算如何使用SNS?
我假设您想应用该模式(S3 PUT->通知-> Lambda),因为您没有发布完整的代码(包括Lambda)本身。
与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));
}
}
如果这是在回答您的问题还是遇到任何问题,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。