如何快速有效地调试CloudFormation模板?

Chr*_*her 70 amazon-web-services aws-cloudformation

CloudFormation是一个功能强大的AWS产品,它允许程序创建AWS资源堆栈,如的应用程序的Web层,一个高性能计算集群,整个应用程序堆栈,用一个单一的API调用.它非常强大.使用它肯定被认为是一种很好的AWS实践,特别是当它与Chef, Puppetcloud-init结合使用时.调试它让我感到恶心.

举一个生产示例:股票mongodb集群模板对我不起作用.我不知道为什么.我确信这很简单,因为它几乎总是如此.我的问题不在于我无法弄清楚出了什么问题.这就是它需要20到30分钟的堆栈才能失败,然后再删除三到四分钟,假设它完全正确地删除了资源.

我错过了什么?我知道--disable-rollback旗帜并像氧气一样使用它.我很久以前就学会了将退出信息包起来cfn-signal并将它们像一艘正在下沉的船上的压舱物一样扔掉.如何更快地完成模板调试过程,或者在我制作它们半小时后我是否永远注意到我的错误?

小智 39

使用aws cloudformation validate-templateAWS CLI工具中的命令.它仅验证您的模板是有效的JSON还是YAML,而不是您的密钥和值是否正确(例如,不检查密钥中的拼写错误)

  • 顺便说一句,这是新AWS CLI工具中的"aws cloudformation validate-template". (7认同)
  • 对于在2017年以上遇到此问题的任何人,现在这是"aws cloudformation validate-template",它只验证您的模板是有效的JSON还是YAML,而不是您的密钥和值是否正确(例如,不检查钥匙错字). (7认同)
  • 如果此工具仅进行文件格式验证则不进行;[jsonlint](https://jsonlint.com/) 或 [yamllint](http://www.yamllint.com/) 足够了吗?此外,该工具的文件大小限制为 51,200 字节。 (3认同)
  • 这解决了一些模板问题,至少. (2认同)

Chr*_*her 22

一年后的另一个选择是将这些模板抽象到第三方库,例如对流层.该库为您构建JSON有效负载,并在此过程中进行了大量验证.这也解决了"哇管理1000行JSON文件确实很难过"的问题.

  • "哇管理一个1000行的JSON文件肯定很难过" - 这肯定是创建嵌套堆栈的原因吗?;-)虽然我确实同意 - 对流层是一些! (3认同)

wjo*_*dan 10

如何使模板调试过程更快,还是让我在犯错半小时后才注意到错误?

以下是一些最佳实践建议,重点是提高复杂CloudFormation模板开发的迭代速度:

使用CloudFormation工具来验证模板和堆栈更新

AWS已经在其自己的“ 最佳实践”文档中概述了这些内容,因此,我不再赘述:

该步骤的重点是在实际执行堆栈创建/更新之前捕获明显的语法或逻辑错误。

隔离测试资源

在复杂的堆栈中使用任何单独的CloudFormation资源之前,请确保通过在较小的独立堆栈中测试其行为,确保全面了解该资源的创建/更新/删除行为的全部范围,包括使用限制和典型的启动/拆卸时间。第一。

  • 如果您正在开发或使用任何第三方自定义资源,请使用适用于语言平台的库来编写单元测试,以确保应用程序逻辑在所有用例中均按预期方式运行。
  • 请注意,根据基本API调用的行为,各个资源类型之间创建/更新/删除单个资源的时间可能会有很大差异。例如,一个复杂的AWS::CloudFront::Distribution资源有时可能需要30-60分钟来创建/更新/删除,而AWS::EC2::SecurityGroup更新只需几秒钟。
  • 单个资源的实现中可能存在错误/问题/局限性,对于单独进行测试(而不是在更大的堆栈中进行测试),调试和开发变通办法要容易得多。请记住一些限制,例如取决于您的单个AWS账户设置的AWS服务限制,或取决于您在其中创建堆栈的区域的服务区域可用性

以较小的增量构建复杂的堆栈

执行堆栈创建/更新时,任何单个资源的故障都将导致堆栈回退整个资源更改集,这可能不必要地破坏其他成功创建的资源,并且在构建具有较长时间的复杂堆栈时会花费很长时间。相关资源的依赖关系图。

解决方案是以较小的Update批次增量构建堆栈,一次添加一个(或几个)资源。这样,如果/在资源创建/更新中发生故障时,回滚不会导致您整个Stack的资源被破坏,而只会在最新的Update中更改资源集。

监视堆栈更新进度

确保在执行创建/更新时通过查看堆栈的事件来监视堆栈更新的进度。这将是调试各个资源的其他问题的起点。


Wad*_*nko 9

您是否查看了AWS Toolkit for Eclipse中包含的AWS CloudFormation模板编辑器 ?它具有语法突出显示,语句完成和AWS CloudFormation部署.

  • "AWS Toolkit for Visual Studio"对我来说是不可或缺的. (6认同)

Pat*_*ron 6

AWS CloudFormation棉短绒提供了额外的静态分析超越aws cloudformation validate-template

它将通知您哪些资源类型和实例类型在某些区域不可用,根据允许的值验证属性值,捕获循环资源依赖项、语法错误、模板限制等

除了 CLI 之外,记住运行 linter 的最流行机制之一是安装编辑器插件,例如Visual Studio Code 扩展,该插件在每个文件保存时运行

此处描述了其他机制,如预提交 Git 钩子

Visual Studio Code 扩展示例截图


Ait*_*tch 5

晚会晚了,但我可能还要补充一点,值得花一些时间来配置和学习您的编辑器。我知道这听起来很基础,但是请尝试一下。

就我而言,使用vim,一旦花了一些时间安装json语法插件,并且(最终)了解了可轻松导航大型CF文件的折叠技术,我的性能就会好得多。我的人现在建议打错字(不要在这里打逗号,等等),突出显示颜色可以节省大量时间,提供清晰的视觉线索。

这可能有助于减轻语法错误,但是其他工具可以更好地解决模板内逻辑错误。希望有一天CF会出现“预览”模式。

  • 根本不是一个可笑的建议。我不确定我是否可以在没有语法突出显示的情况下进行编码。 (2认同)
  • CFN的预览显示了您将要创建的所有资源,并且还将告诉您堆栈将花费多少。我正在使用Java API,因此不确定在CLI上是否可用,但是请尝试以下操作:[link](http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_EstimateTemplateCost.html ) (2认同)