CloudFormation 是幂等的吗?

Is CloudFormation idempotent?

我在网上很多地方都看到CloudFormation不是幂等的,但是我找不到任何例子来证明这个事实。

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

维基百科idempotent的定义如下:

In computer science, the term idempotent is used more comprehensively to describe an operation that will produce the same results if executed once or multiple times.

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

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

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

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

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

看看这些 API 调用:

  1. CreateStack
  2. UpdateStack
  3. DeleteStack

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

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

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