按照您指定的顺序使用 Terraform 构建 AWS 基础设施

Build AWS infrastructure using terrafrom in an order that you specify

最近我遇到了一种情况,我正在使用 Terraform 构建 AWS 基础设施来为某些应用程序设置集群环境。问题是,当我应用 terraform 脚本时,它会构建所有必要的模块并一起旋转多个实例,然后完成。这可能意味着这样做,无论如何,terraform 在构建这样的基础设施方面做得很好。

当我试图设置这样的基础设施以集群方式部署应用程序时,这里使用的是配置管理工具。在构建 ec2 实例时,CM 脚本会被相应地调用和配置。当对模块有一些依赖时,问题就来了。

考虑一个场景,其中 2(A 和 B)个组件是 Autoscale 组的一部分,而 2(C 和 D)个组件是正常的 ec2 实例。在这里,如果我希望先构建 A,然后再构建 C,因为 C 实例依赖于必须首先完全配置的 A,反之亦然,我如何控制 terraform 帮助我实现此目的的顺序。

请有人帮我实现它。

提前致谢

您可以使用 depends_on 参数。可以使资源明确依赖于其他资源。 Terraform 只会在相关资源已成功配置后构建资源。

https://www.terraform.io/intro/getting-started/dependencies.html

另一个答案在字面意义上是正确的,但总的来说这是要避免的事情。构建您的 CM 代码,使其不断重新尝试收敛,直到成功。特别是对于 Chef,您可以使用 chef-client cookbook 来部署以给定时间间隔自动运行 Chef 收敛的服务(默认情况下为 30 分钟,但您可能希望将其缩短)。 运行 "right" 顺序中的事情听起来不错,但在处理拜占庭式故障时,您会感谢过去的自己,无论顺序如何,都能确保可靠的收敛。

这个问题的范围很广,其他答案都是对的。我想补充的是,使用模块来确定逻辑子项目的顺序也很有效。

在 terraform 中,您可以在资源级别使用 depends_on 强制程序顺序,但不能将其用于模块。但是对于模块,您可以使用一个模块的输出作为另一个模块的输入,这将帮助您管理模块级别的程序顺序。

因此,在您的情况下,我会将 A 和 B 放在一个模块中,将 C 和 D 放在另一个模块中,并使用一个到另一个的输出变量来控制顺序。