CloudFormation是一款功能强大的AWS产品,允许通过单个API调用以编程方式创建AWS资源堆栈,例如web tier of an application,和high performance computing cluster,或an entire application stack,。它非常强大。使用它肯定被认为是一种很好的AWS实践,特别是当它与Chef, Puppet,或cloud-init.结合使用时,调试它会让我感到恶心。
举一个生产示例:股票mongodb cluster templates对我不起作用。我不知道为什么。我确信这很简单,因为它几乎总是如此。我的问题不在于我无法弄清楚出了什么问题。这就是它需要20到30分钟的堆栈才能失败,然后再删除三到四分钟,假设它完全正确地删除了资源。
我错过了什么?我知道--disable-rollback
标志并像氧气一样使用它。我很久以前就学会了用cfn-signal
包裹退出消息,然后将它们像一艘正在下沉的船上的压载物一样扔掉。如何更快地完成模板调试过程,或者在制作模板半小时后我是否会永远注意到我的错误?
答案 0 :(得分:37)
使用AWS CLI工具中的aws cloudformation validate-template
命令。它仅验证您的模板是有效的JSON还是YAML,而不是您的密钥和值是否正确(例如,不检查密钥中的拼写错误)
答案 1 :(得分:20)
一年后的另一个选择是将这些模板抽象到第三方库,例如troposphere。该库为您构建JSON有效负载,并在此过程中进行了大量验证。这也解决了“Wow管理1000行JSON文件确实很难过”的问题。
答案 2 :(得分:8)
您是否查看过AWS Toolkit for Eclipse中包含的AWS CloudFormation模板编辑器?它具有语法突出显示,语句完成和AWS CloudFormation部署。
答案 3 :(得分:8)
如何更快地完成模板调试过程,或者在制作模板半小时后我是否会永远注意到我的错误?
以下是一些最佳实践建议,专注于提高复杂CloudFormation模板开发的迭代速度:
AWS已在其自己的Best Practices文档中概述了这些内容,因此我不再重复这些内容:
此步骤的目的是在实际执行堆栈创建/更新之前捕获明显的语法或逻辑错误。
在复杂堆栈中使用任何单个CloudFormation资源之前,请确保通过测试它们在较小的行为中的行为,彻底了解该资源的创建/更新/删除行为的全部范围,包括对使用的限制和典型的启动/拆除时间。 ,首先是独立堆栈。
AWS::CloudFront::Distribution
资源有时可以 30-60分钟来创建/更新/删除,而AWS::EC2::SecurityGroup
资源可以在几秒钟内更新。执行堆栈创建/更新时,任何单个资源中的失败都会导致堆栈回滚整组资源更改,这可能会不必要地破坏其他成功创建的资源,并且在构建复杂堆栈时需要很长时间使用相关资源的长依赖图。
解决方法是在较小的更新批次中逐步构建堆栈,一次添加一个(或几个)资源。这样,如果/当资源创建/更新中发生故障时,回滚不会导致整个Stack的资源被破坏,只会更新最新更新中的资源集。
通过在执行创建/更新时查看堆栈的事件,确保Monitor the Progress of your Stack Update。这将是调试个别资源的进一步问题的起点。
答案 4 :(得分:5)
晚会但我可能还会补充说,花一点时间配置和学习编辑器是值得的。我知道这听起来很可笑,但作为一个答案,但尝试一下。
在我的情况下,使用vim,我花了一些时间安装json语法插件后表现得更好,并且(最终)理解折叠技术以轻松导航大型CF文件。我现在建议使用拼写错误(逗号不应该是等等),颜色突出显示可以节省大量时间,提供清晰的视觉线索。
这可能有助于缓解语法错误,但其他工具可以更好地修复模板内逻辑错误。希望有一天会有一个"预览" CF上的模式。
答案 5 :(得分:4)
适用于JetBrains IDE(IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio ),有AWS CloudFormation插件,支持深入检查JSON和YAML CFN模板
答案 6 :(得分:2)
如果您正在处理EC2机器,那么我建议您登录EC2机器并拖尾boot.log文件(RHEL6 / Centos中的/var/log/boot.log)。此文件将使用您的所有shell活动进行更新(活动包括:安装,下载文件,复制文件等)。
此外,使用http://www.jsoneditoronline.org/之类的编辑器来获取JSON的TREE表示。这有助于您检查JSON元素的顺序。
更新文件时,请始终使用http://www.git-tower.com/blog/diff-tools-mac/等工具或实际版本控制系统,以确保您不会意外更改可能会破坏脚本的内容。
答案 7 :(得分:2)
除AWS CLI aws cloudformation validate-template
命令外,还有一个基于节点的cfn-check工具可以进行更深入的验证。
答案 8 :(得分:1)
去年12月添加到Cloudformation的最新功能是增加了additional Parameter Types。这些新类型允许您的模板执行更强大的数据检查,并且还可以快速失败"在创建资源和嵌套的Cloudformation堆栈时。当使用新的ConstraintDescription attribute传递无效值时,您还可以提供更好的人类可读的自定义错误消息。
在处理各种VPC资源时,新类型特别有用。您可以确保模板的参数是正确的类型,并且明确表示期望单个值与列表。
例如:
"Parameters" : {
"SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
"GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}
答案 9 :(得分:1)
您还可以在此处使用amazon提供的CloudFormation Designer:https://console.aws.amazon.com/cloudformation/designer/home?region=us-east-1
只需将模板(JSON)粘贴到&#34;模板&#34;窗格,然后单击刻度线符号以验证您的模板。任何错误都会显示在&#34;错误&#34;窗格中。
希望这有帮助。
答案 10 :(得分:0)
请在https://pypi.org/project/cloudformation-validator/签出我的cloudformation验证程序
这将验证架构,然后再次验证规则列表,并允许自定义规则。我还允许与部署工具轻松集成。
答案 11 :(得分:0)
AWS CloudFormation linter cfn-python-lint
提供了除aws cloudformation validate-template
之外的其他静态分析: