Amazon web services AWS cloudformation:一个大模板文件还是多个小模板文件?

Amazon web services AWS cloudformation:一个大模板文件还是多个小模板文件?,amazon-web-services,boto,amazon-cloudformation,Amazon Web Services,Boto,Amazon Cloudformation,我将重写我的许多aws部署代码,以启动所有由boto控制的cloudformation,而不是使用boto单独启动每个元素。有人知道使用一个巨大的模板文件是最好的做法,它可以把所有的东西都放在一起,还是使用很多较小的模板文件 一个巨型的优点似乎是AWS可以为你处理所有的依赖性,所以会让事情稍微快一点。明显的缺点是,维持这种状态似乎是一场噩梦 是否有人尝试在运行时合并模板文件,以便将其视为一个大的模板文件,或者这很难维护?我不确定是否有任何官方指导,但我的感觉是,如果您打算使用CloudForma

我将重写我的许多aws部署代码,以启动所有由boto控制的cloudformation,而不是使用boto单独启动每个元素。有人知道使用一个巨大的模板文件是最好的做法,它可以把所有的东西都放在一起,还是使用很多较小的模板文件

一个巨型的优点似乎是AWS可以为你处理所有的依赖性,所以会让事情稍微快一点。明显的缺点是,维持这种状态似乎是一场噩梦


是否有人尝试在运行时合并模板文件,以便将其视为一个大的模板文件,或者这很难维护?

我不确定是否有任何官方指导,但我的感觉是,如果您打算使用CloudFormation路径,将整个堆栈放在一个模板中是有意义的。这样,正如您所提到的,CloudFormation的事务性为您所用,整个堆栈要么被创建,要么不被创建。

我们从一个大模板中的所有内容开始,但最终对其进行了一些重构,包括一个嵌套的堆栈和一些资源,以避免在其他模板中重复它

我发现的最大挑战之一是,拥有一个整体堆栈会使零碎更新变得更加困难,而且当存在依赖于整体中资源的其他堆栈(例如安全组)时,这也会让人感到尴尬

在re:Invent2014上有一次会议,会上有许多有用的提示:APP304-AWS CloudFormation最佳实践

他们建议根据层或共享位的组合来分解堆栈,例如:身份、基本网络、共享服务、后端服务、前端服务


虽然我不喜欢处理大量的参数和输出(在堆栈之间输入它们很烦人),但这似乎是构成所需基础设施的更灵活的方式。

没有简单的答案,但要记住以下几点:

  • 编写多个小模板时,请编写一个主模板,该模板将调用小模板(嵌套堆栈)。当您想要更新一个小的文件时,在文件中进行更改,然后更新主文件。只有已更改的资源将被更新,堆栈更新的结果将是原子的(全部清除或回滚所有内容)。CloudFormation仍将并行运行嵌套堆栈,因此不会太慢

  • CloudFormation中的资源数量有一个限制(每个堆栈200个资源)。例如,如果您有SecurityGroupIngress/Exgress规则,那么很容易访问它。不确定支持部门是否可以更新此限制

  • 另一方面,将参数馈送到嵌套堆栈可能会导致包含不太多信息的大文件。。。考虑这一点:你必须把所有参数都输入到调用中,在嵌套栈中,你必须再次声明所有的参数。相信我,两级筑巢真的很痛苦

我找到的最好的解决方案是使用CloudFormation模板前端(我在python中使用),这样您就可以真正地将基础设施描述为代码,并具有代码的所有优点(循环、条件、外部文件、函数),最后,您就得到了一个真正的CloudFormation模板


我已经能够用这个系统编写巨大的CloudFormation模板,而无需任何维护噩梦…

我知道我在讨论这个问题时迟到了,但我想分享一个CLI工具,它允许您创建多个小型CloudFormation模板,这些模板将组合到大型CloudFormation模板中并部署到CloudFormation堆栈中