【问题标题】:aws-cdk remove resource from stack that used in another stackaws-cdk 从另一个堆栈中使用的堆栈中删除资源
【发布时间】:2022-03-17 05:36:28
【问题描述】:

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

我有 2 个堆栈

StackA -> 定义资源 outA

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

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

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

此时我无法部署任何堆栈! 如果我尝试部署 StackA 得到错误:

Export 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",
});

} 
}

堆栈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",
       });
    }
  }

应用:

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)

【问题讨论】:

    标签: amazon-cloudformation aws-cdk


    【解决方案1】:

    这似乎是整个 CDK 用户群的常见问题。 https://aws-blog.de/2020/09/deployment-issues-with-cross-stack-dependencies-and-the-cdk.html

    描述了对我有帮助的解决方案

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

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

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

    【讨论】:

      【解决方案2】:

      这是堆栈依赖,它可能是一个真正的大问题。你必须把你的筹码放回原来的值。然后在第二个堆栈中添加一个虚拟值(取决于原始资源)并推送它。然后从原来的堆栈中取出并替换,然后在第二个堆栈中替换。

      但更好的是,如果这两个堆栈总是相互依赖,请将它们都设为 NestedStacks 并将它们放在同一个公共堆栈中以便一次部署。仍然在代码中保持分离,但一切都部署在一起。

      如果这是一个问题(一起部署),您可以通过使用以from 开头的各种方法来解决问题,从另一个堆栈导入资源,而不是依赖它作为传递的参数。这很容易出现很多其他问题(就像黑客通常一样),因为许多 from 方法无法获取所有信息,此外,除非您自己设置某种自动命名方案,否则部署变得困难多种环境。 (CDK的关键奖励)

      【讨论】:

        猜你喜欢
        • 2020-12-19
        • 2021-02-18
        • 2021-03-15
        • 2020-10-29
        • 2018-06-21
        • 2022-01-27
        • 2022-01-20
        • 1970-01-01
        • 2021-04-22
        相关资源
        最近更新 更多