【问题标题】:Is CloudFormation idempotent?CloudFormation 是幂等的吗?
【发布时间】:2015-09-25 15:53:47
【问题描述】:

我在互联网上的许多地方都读到 CloudFormation 不是幂等的,但我找不到任何证明这一事实的例子。

您能否提供一个运行资源的示例来证明 CloudFormation 不是幂等的?

【问题讨论】:

  • id(instance_id、vpc_id、securitygroup_id等)不同
  • @BMW 如果您使用create-stack,将生成例如安全组ID。但是如果你在同一个模板上使用update-stack,它是幂等的:没有资源会改变(不会是重复、错误等等,基础设施状态是你所期望的)。

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

根据维基百科对idempotent的定义如下:

在计算机科学中,幂等一词的使用更为全面 描述将产生相同结果的操作,如果 执行一次或多次。

CloudFormation 在其行为的几个方面被认为不是幂等的:

  • 为已存在的堆栈调用 create API 将导致错误
  • 使用未更改的 CloudFormation 堆栈调用更新 API 会导致错误
  • 再次创建和删除同一个堆栈将导致为 IAM 用户、安全组 ID、EC2 实例 ID、VPC ID 等创建具有不同 ARN 的资源...
  • 如果使用现有内容更新现有堆栈,则在 CloudFormation 之外修改的资源不会更改回原始值

但是,从高层次来看,使用 CloudFormation 的主要原因之一是您可以将基础架构表示为代码,以便您可以使用它重复生成相同的基础架构。这几乎与幂等的原始定义相同,但区别在于这里的 多次 部分。正如上面列出的,当使用相同的堆栈并在其上应用或删除堆栈并重新创建它时,从技术上讲,您不会得到确切相同的结果,但从实际的角度来看,这是完全可以理解的,而且通常完全可以接受。

【讨论】:

  • 如果您无法重新运行相同的脚本两次,您将如何在 CI 管道中自动化 Cloudformation 脚本?我想将我的基础设施与应用程序代码一起编写脚本,以便两者都可以随着时间的推移而发展,但我看不到多次运行它的方法
  • 他们配置我的 CI 管道以部署 CFN 脚本的方式是,即使没有任何更改,也可以在属性中包含 Jenkins 构建 ID 之类的内容。然后我用这个我想作为一个像标签一样总是会改变的东西的输入。这允许 CFN 在每次构建时更新和部署。
【解决方案2】:

我不确定这个答案是否有用,因为该问题已在 2 年前发布。迟到总比没有好。

AWS CloudFormation 在这 2 年中发生了很大变化。现在,我可以肯定地说,它的 API 调用是幂等的。

看看这些 API 调用:

  1. CreateStack
  2. UpdateStack
  3. DeleteStack

你会发现有一个可选的参数叫做ClientRequestToken。这为 API 调用提供了幂等性。它是客户端提供的令牌,用于告诉 CloudFormation 服务它没有进行新的 API 调用。只要您使用相同的令牌并在其余参数相同的情况下继续进行调用,CloudFormation 就知道您只是在重试调用。

【讨论】:

    【解决方案3】:

    Cloudformation 是幂等的,前提是您尚未对已完成的堆栈进行更新,如果有更改,它将更新,现在更新资源可能需要删除它并创建或更新不创建新资源

    要了解更多有关 cfn-hup 流程的信息,这将对您有所帮助

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 2015-05-25
      相关资源
      最近更新 更多