【问题标题】:Can UsePreviousTemplate (in CloudFormation UpdateStack) be used together with nested stacksUsePreviousTemplate(在 CloudFormation UpdateStack 中)能否与嵌套堆栈一起使用
【发布时间】:2020-09-05 19:59:26
【问题描述】:

使用嵌套堆栈是 AWS CloudFormation 中的 best practice,实际上它们解决了许多问题(代码重用、堆栈限制等)。

更新堆栈时(通过 UpdateStack 或 ChangeSets),可以提供UsePreviousTemplate=True 以指示 CloudFormation 使用堆栈当前存在的任何模板。如果您只想更新一些参数,特别是如果您有一些自动脚本进行更新,这很有用(我们使用我们想要发布的 github 上代码的 SHA 更新参数,而 CloudFormation 会完成其余的us -- 构建和部署,所以一旦我们准备好部署代码,我们就从 lambda 更新这个参数);在这种情况下,您要确保您所做的只是更新由参数控制的内容,而不是意外提供新(或旧)模板。

似乎没有文档说明如果在涉及嵌套堆栈时提供此参数会发生什么,似乎也没有任何地方可以在这​​方面指定任何有用的东西。 definition of the nested stack 中似乎也没有什么用处:

Type: AWS::CloudFormation::Stack
Properties: 
  NotificationARNs: 
    - String
  Parameters: 
    Key : Value
  Tags: 
    - Tag
  TemplateURL: String
  TimeoutInMinutes: Integer

因此提出以下问题:

  • 使用UsePreviousTemplate=True 在具有嵌套堆栈的堆栈上进行更新时会出现什么行为?
  • 是否可以使用 UsePreviousTemplate=True 之类的东西进行堆栈更新,不仅适用于父堆栈,也适用于嵌套堆栈?

【问题讨论】:

    标签: amazon-cloudformation nested-stack


    【解决方案1】:

    在具有嵌套堆栈的堆栈上使用 UsePreviousTemplate=True 进行更新时的行为是什么?

    正在使用之前的根堆栈模板。但是,此模板指向嵌套模板的 s3 位置,并且再次从该位置检索嵌套模板。这意味着:

    • 对该模板在 s3 上的任何更改都会导致这些更改部署到您的嵌套堆栈中
    • 如果在该位置找不到模板,堆栈更新将失败。
    • 通常,您将始终在 ChangeSet 中看到嵌套堆栈,(假设)因为 CloudFormation 直到它实际运行时才知道模板中是否有更改。也意味着父节点的堆栈更新会更慢。

    如果您通过在您的网址中添加?versionId=... 在您的存储桶中启用了版本控制,则可以通过使用版本控制的网址来避免第一个问题:

    https://s3.#BUCKETREGION#.amazonaws.com/..../.../.../.../nested.template?versionId=XXXX

    注意:无论嵌套堆栈中是否有宏(这合法地意味着至少它们需要在更新时重新评估),或者是否给出了 CAPABILITY_AUTO_EXPAND (​​如果没有,这个 保证嵌套堆栈中没有宏)。

    是否可以使用 UsePreviousTemplate=True 之类的东西进行堆栈更新,不仅适用于父堆栈,也适用于嵌套堆栈?

    可以设置一个不允许更新嵌套堆栈的堆栈策略([此处][3],在“阻止更新嵌套堆栈”下),但是在我的实验中,它所做的只是禁止对嵌套堆栈进行任何更新父堆栈(因为任何更新都会自动影响客户端堆栈)。

    所以现在我倾向于说“不”,但我很高兴在这里被证明是错误的!

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 1970-01-01
      • 2017-11-25
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多