aws-cdk 从堆栈中删除另一个堆栈中使用的资源

y. *_* bs 5 aws-cloudformation aws-cdk

尝试理解 CDK 的一个奇怪行为:

我有2堆

StackA -> 定义资源 outA

StackB -> 定义资源 outB -它依赖于资源 outA

第一个“CDK 部署”运行没有任何问题。

现在,我通过删除“outA”资源来更改 StackA,并创建一个新资源调用“outAnew”并更新 StackB 以使用此新值

此时我无法部署任何Stack!如果我尝试部署 StackA 出现错误:

导出 outA 无法删除,因为它正在被 StackB 和 StackC 使用

如果尝试部署 StackB,由于依赖性,它会首先尝试部署 StackA。

任何想法?

示例代码:

堆栈A:

export class CdkDependenciesStackA extends cdk.Stack {
// public out_a: cdk.CfnOutput;
public out_a_new: cdk.CfnOutput;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// this.out_a = new cdk.CfnOutput(this, "out_a", {
//   value: "outA",
//   exportName: "outA",
// });
this.out_a_new = new cdk.CfnOutput(this, "out_a_new", {
  value: "outAnew",
  exportName: "outAnew",
});

} 
}
Run Code Online (Sandbox Code Playgroud)

堆栈B:

export class CdkDependenciesStackB extends cdk.Stack {
    public out_b: cdk.CfnOutput;
    constructor(
      scope: cdk.Construct,
      id: string,
      outputValue: cdk.CfnOutput,
      props?: cdk.StackProps
    ) {
      super(scope, id, props);
      this.out_b = new cdk.CfnOutput(this, "out_b", {
        value: `outB_${outputValue.importValue}`,
        exportName: "outB",
       });
    }
  }
Run Code Online (Sandbox Code Playgroud)

应用程序:

const app = new cdk.App();
const stack_a = new stacks.CdkDependenciesStackA(
  app,
  "CdkDependenciesStack",
  {}
   );

 const stack_b =new stacks.CdkDependenciesStackB(
   app,
   "CdkDependenciesStackB",
   stack_a.out_a_new,
   {}
  );
 stack_b.addDependency(stack_a)
Run Code Online (Sandbox Code Playgroud)

Mil*_*anG 6

这似乎是整个 CDK 用户群的常见问题。https://aws-blog.de/2020/09/deployment-issues-with-cross-stack-dependency-and-the-cdk.html描述了对我有帮助的解决方案

由于首先部署导出值的堆栈,因此您仍然需要保留原始导出,以便

  • 可以部署导出堆栈来导出新值
  • 可以部署导入栈导入新值并停止导入旧值

之后您可以停止导出旧值。