UsePreviousTemplate(在CloudFormation UpdateStack中)能否与嵌套堆栈一起使用?

问题描述 投票:0回答:1

使用嵌套堆栈是一种 最佳做法 在AWS CloudFormation中,它们确实解决了许多问题(代码重用、堆栈限制等)。

当更新堆栈时(通过UpdateStack或ChangeSets),可以提供 UsePreviousTemplate=True 以指示 CloudForm 使用当前堆栈的任何模板。如果您只想更新一些参数,特别是如果您有一些自动脚本进行更新(我们在 github 上用我们要上线的代码的 SHA 更新一个参数,CloudFormation 为我们完成剩下的工作 -- 构建和部署,因此我们在为部署准备好代码后立即从 lambda 更新该参数);在这种情况下,您要确保您所做的只是更新由参数控制的东西,而不是意外地提供一个新(或旧)模板。

似乎没有任何文档说明当涉及到嵌套堆栈时,如果你给出这个参数会发生什么,似乎也没有任何地方可以在这方面指定任何有用的东西。似乎也没有任何有用的 嵌套栈的定义:

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

因此提出以下问题。

  • 在进行更新时的行为是什么?UsePreviousTemplate=True 的堆栈上进行堆栈更新?
  • 能否使用类似于这样的方法进行堆栈更新?UsePreviousTemplate=True 不仅针对父栈,而且针对嵌套栈?
amazon-cloudformation
1个回答
1
投票

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

正在使用根栈的前一个模板。然而这个模板指向嵌套模板的s3位置,嵌套模板又从这个位置被检索出来。这意味着。

  • 在s3上对模板的任何更改都会导致这些更改被部署到你的嵌套栈中
  • 如果在该点上再也找不到模板,堆栈更新就会失败。
  • 一般情况下,您总是会在ChangeSet中看到嵌套的堆栈,(应该是)因为CloudFormation在实际运行之前并不知道模板是否有变化。也意味着父体的堆栈更新会比较慢。

如果您在您的 bucket 中开启了版本管理,您可以通过使用版本化 URL 来避免上述第一个问题,方法是在您的 bucket 中添加 ?versionId=... 到你的url。

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

注意:不管嵌套的堆栈中是否有Macros(合法地意味着它们至少需要在更新时重新评估),甚至不管CAPABILITY_AUTO_EXPAND是否被赋予(如果没有,这个 保证 嵌套堆栈中没有宏)。)

能否使用类似于以下的方法进行堆栈更新?UsePreviousTemplate=True 不仅是父堆栈,也包括嵌套的堆栈?

可以设置一个堆栈策略来禁止对嵌套堆栈的更新([这里][3],在 "防止对嵌套堆栈的更新 "下),但是在我的实验中,它所做的只是禁止对父堆栈的任何更新(因为任何更新都会自动影响客户端堆栈)。

所以现在我倾向于说 "不",但我很乐意被证明是错误的。

© www.soinside.com 2019 - 2024. All rights reserved.