上下文,我有一个CDK应用程序,使用以下设置有两个堆栈:
Stack_A:
StateMachine_A
Lambda_A
S3Bucket_A
IAMRole_A
Stack_B:
StateMachine_B
SageMakerTrainJob_B
IAMRole_B
StateMachine_A使用执行角色IAMRole_A运行Lambda_A。 StateMachine_A中的一个单独步骤将数据写入S3Bucket_A。 StateMachine_B使用执行角色IAMRole_B运行SageMakerTrainJob_B。 Lambda_A的目的是开始执行StateMachine_B,它的SageMakerTrainJob_B需要从S3Bucket_A中读取。因此,我们必须配置以下权限:
我们试图通过在Stack_A上的Stack_B中创建直接依赖项来在CDK中对此模型化,并使用Stack_B定义中对IAMRole_A和S3Bucket_A的引用来授予所需的代码权限。但是,这会产生以下错误:
Error: 'Stack_B' depends on 'Stack_A' (dependency added using stack.addDependency()). Adding this dependency (Stack_A -> Stack_B/IAMRole_B/Resource.Arn) would create a cyclic reference.
同样,尝试在另一个方向上对依赖关系建模会产生相同的错误:
Error: 'Stack_A' depends on 'Stack_B' (dependency added using stack.addDependency()). Adding this dependency (Stack_B -> Stack_A/S3Bucket_A/Resource.Arn) would create a cyclic reference.
有没有使用代码依赖项解决此问题的方法?对于这种情况,是否有建议的最佳做法?我们考虑过的一些选项包括:
此外,我发现在CodeCommit/CodePipeline和APIGateway/Lambda的CDK开发过程中,存在类似的问题。这是一个相关的错误,还是我们只是试图做一些不被支持的事情?
答案 0 :(得分:4)
循环引用总是很棘手。这不是CDK独有的问题。当您从逻辑上解释问题时,您会看到事情开始崩溃的地方。 CloudFormation必须创建另一个资源依赖的任何资源,然后才能创建依赖资源。没有一种解决方案可以适合所有方法,但是我会给出一些可行的想法。