我一直在使用cloudformation模板一段时间,我一直在问自己以下问题:
使用AWS::CloudFormation::Init
将这些语句直接添加到UserData
块中有什么好处?
到目前为止,我发现AWS::CloudFormation::Init
方式更加冗长,特别是当你需要几个configSets
以确保你的陈述有某种顺序时。
此外,某些AMI不支持在开箱即用的情况下运行该init块,并且需要额外的脚本cfn-init
,它会增加更多的冗长。
我能想到的好处是:
如果您喜欢与Puppet和Chef类似的配置的简单声明性DSL,请使用AWS :: CloudFormation :: Init。
如果你发现它很麻烦,可能是UserData更合适。太多的configSets可能表明您正在使用错误的工具(或订购不需要订购的东西!)。
此外,请注意AWS :: CloudFormation :: Init是旧的,它早于CloudFormation对YAML模板的支持。
在YAML支持之前,将脚本放在UserData中很困难,因为shell脚本的每一行都需要在JSON数组中编码。这使得阅读困难,容易犯错误。
在我看来,使用AWS :: CloudFormation :: Init在仅给出这两个选择时更有意义。
目前,我的首选是将shell脚本保留在CloudFormation之外,在外部对它们进行单元测试,然后将它们作为base64编码的字符串作为参数提供。 (请注意参数的4096个字符限制!)。
当然,它还取决于配置的复杂性。您不希望在UserData中的shell脚本中执行太多操作,因为它很快就会变得无法维护。