我的CloudFormation模板已经很长了。一个原因是因为我的df['A'] == cond1
部分变得非常庞大。这是我所拥有的一小部分样本:
=index(df!A:Z, match(cond1, df!A:A,0)),col)
将它作为一堆命令放入userdata部分会不会更好?
AWS::CloudFormation::Init
将此保留在Init over userdata中有什么好处?
答案 0 :(得分:6)
AWS::CloudFormation::Init
比UserData
的主要优势在于前者是可更新的-如果您修改AWS::CloudFormation::Init
部分,CloudFormation将在其中更新您的EC2实例 放置 ,而如果您在模板中修改EC2资源的UserData
属性并更新堆栈,CloudFormation将 替换 该EC2实例。
例如,这很方便,如果您想更新在EC2实例上安装的软件包而无需重新创建它。
答案 1 :(得分:3)
将CFN-INIT视为用户数据的定制版本是100%错误 - CFN-INIT的功能超出了用户数据。
userdata是基于程序的,运行命令
A
乙
C
d
CFN-INIT是理想的基于状态。
像这样做
让B像这样。
CFN-INIT可以再次运行 - 例如在堆栈更新期间,更新配置,或者特别是将状态置于所需的“状态” - 用户数据因为其程序背景不能 - 不能保证能够运行第二个时间并将实例移动到某个状态。
您可以在CFN-INIT中运行命令 - 即它也可以是程序性的 - 但它也可以是基于状态的......即/tmp/something.txt具有此内容。或者服务X已启动。 'Apache Installed',它知道没有apache,最新的apache,apache版本之间的差异 - 并且它会相应地发挥作用。
答案 2 :(得分:2)
最大的好处是,如果您还将其用于其他用途,则不会污染用户数据。因此,它存在于CloudFormation Stack中,并存在于每个Instance用户数据中。
cfn-init基本上从CloudFormation中提取这些数据并运行命令。
根据这种复杂程度,您可以考虑将其烘焙到AMI中,只需在一个命令中调用它与一系列命令。
另一个不同之处在于必须将cfn-init烘焙到您用于启动机器的AMI中。现在几乎所有的AMI都是如此,所以并不是真正引起重大关注的原因。