我如何快速有效地debuggingCloudFormation模板?

CloudFormation是一个function强大的AWS产品,允许使用单个API调用以编程方式创buildAWS资源堆栈,例如应用程序的Web层, 高性能计算群集或整个应用程序堆栈 。 这是非常强大的。 使用它肯定被认为是一个很好的AWS实践,特别是当它与厨师, 木偶或云初始化相结合。 debugging它驱使我负责。

举一个生产示例:股票MongoDB群集模板不适用于我。 我不知道为什么。 我相信这是简单的,因为它几乎总是。 我的问题不是我无法弄清楚什么是错的。 这是因为它需要20到30分钟的时间才能出现故障,然后再过三到四分钟才能删除,假设它根本就删除了资源。

我错过了什么? 我知道 – --disable-rollback标志,并使用它像氧气。 我很久以前就学会了用cfn-signal来包装出口信息,并把它们像沉没船上的压载水一样扔掉。 我怎样才能使模板debugging过程更快,或者我做了半个小时之后,我是否永远注意到我的错误?

在AWS CLI工具中使用aws cloudformation validate-template命令

另一种select,一年后,将这些模板抽象到第三方库,如对stream层 。 该库为您构buildJSON有效载荷,并在此过程中进行了大量validation。 这也解决了“pipe理1000行JSON文件肯定是悲哀”的问题。

您是否查看了AWS Toolkit for Eclipse中包含的AWS CloudFormation模板编辑器? 它具有语法高亮,语句完成和部署到AWS CloudFormation。

晚了,但我也可以补充说,花一点时间configuration和学习你的编辑器是值得的。 我知道这听起来可笑基本作为答案,但尝试。

就我而言,在vim中,我花了一些时间来安装json语法插件,并且(最后)理解了折叠技术来轻松导航大型CF文件,所以执行得更好。 我现在build议input错字(不应该是逗号等),颜色突出显示可以节省大量时间,提供清晰的视觉线索。

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

我怎样才能使模板debugging过程更快,或者我做了半个小时之后,我是否永远注意到我的错误?

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

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

AWS已经在自己的最佳实践文档中概述了这些内容,所以我不再重复:

  • 在使用之前validation模板
  • 在更新堆栈之前创build更改集

这一步的要点是在实际执行堆栈创build/更新之前捕捉明显的语法或逻辑错误。

testing资源孤立

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

  • 如果您正在开发或使用任何第三方自定义资源,请使用适用于语言平台的适当库编写unit testing,以确保应用程序逻辑在所有使用情况下的行为如预期。
  • 请注意,根据基础API调用的行为,单个资源创build/更新/删除的时间可能在资源types之间差别很大。 例如,复杂的AWS::CloudFront::Distribution资源有时可能需要30-60分钟来创build/更新/删除,而AWS::EC2::SecurityGroup在几秒钟内更新。
  • 单个资源在执行时可能会有错误/问题/限制,这些debugging更容易debugging,并且在单独进行testing时,而不是在更大的堆栈中进行testing。 请记住,根据您个人的AWS账户设置, AWS Service Limits等限制 ,或者服务的地区可用性(取决于您创build堆栈的地区)。

以小增量构build复杂的堆栈

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

解决scheme是在较小的更新批量中逐步构build堆栈,一次添加资源一个(或几个)。 这样,如果/当资源创build/更新发生故障时,回滚不会导致整个堆栈的资源被破坏,只是在最新的更新中更改了资源集合。

监视堆栈更新的进度

一定要通过在创build/更新时查看堆栈的事件来监视堆栈更新的进度 。 这将成为debugging个别资源的进一步问题的起点。

如果您正在处理EC2计算机,那么我build议您login到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/这样的工具或者一个真正的版本控制系统来确保你没有意外地改变可能会破坏你的脚本的东西。;

您也可以使用Amazon的CloudFormation Designer: https ://console.aws.amazon.com/cloudformation/designer/home?region = us-est-1

只需将模板(JSON)粘贴到“模板”窗格上,然后单击打勾符号以validation您的模板。 任何错误将显示在“错误”窗格中。

希望这可以帮助。

对于JetBrains IDE(IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio), AWS CloudFormation插件支持对JSON和YAML CFN模板的深入检查

去年12月joinCloudformation的一项新function是增加了额外的参数types 。 这些新types允许您的模板执行更强大的数据检查,并且在创build资源和嵌套CloudForms堆栈时也可以“快速失败”。 当使用新的ConstraintDescription属性传递无效值时,您还可以提供更好的人类可读自定义错误消息。

处理各种VPC资源时,新types特别有用。 您可以确保您的模板的参数是正确的types,并明确预期单个值与列表。

例如:

 "Parameters" : { "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...}, "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...} } 

除AWS CLI aws cloudformation validate-template命令外,还有一个基于节点的cfn-check工具,可以进行更深入的validation。