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


82

CloudFormation是一个功能强大的AWS产品,它允许程序创建AWS资源堆栈,如的应用程序的Web层,一个高性能计算集群,整个应用程序堆栈,用一个单一的API调用。它非常强大。使用它肯定被认为是一种良好的AWS做法,尤其是当它与Chef, Puppetcloud-init结合使用时调试它会把我带到恶习。

以生产示例为例:库存mongodb群集模板对我不起作用。我不知道为什么。我敢肯定这很简单,几乎总是如此。我的问题不是我不知道出了什么问题。这是因为它需要20到30分钟才能使堆栈失败,然后再删除3到4分钟(假设它完全删除了资源)。

我想念什么?我知道该--disable-rollback标志,并像氧气一样使用它。我很久以前就学会了将退出消息打包在一起cfn-signal,并将它们像压舱物一样从沉没的船上扔下来。如何提高模板调试过程的速度,还是在错误发生半小时后就一直停留在错误提示的位置?


3
有时甚至连JSON中的错别字都不会在构建过程中等待10分钟以上,因为它不会注意到特定资源类型在尝试启动该资源之前没有特定的属性名称。
埃里克·哈蒙德

1
我的收藏夹没有特别的顺序:当您切换资源上下文并遇到几乎但不是完全相同的属性时,忘记在用户脚本声明中添加转义的引号,以及与VolumeAttachments有关的操作,因为它们有时会失败完全没有理由。
Christopher

1
+1提及“禁用自动回滚”-很棒,它为子
堆栈

1
我发现策略段中的错误将导致BucketPolicy之类的东西永远陷入CREATE阶段-如果某些东西停留在CREATE那里,那就从那里开始。
埃里克·诺德

Answers:


46

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



7
顺便说一下,这是aws cloudformation validate-template在新的AWS CLI工具中。
Christopher

8
对于在2017年或以后遇到此问题的任何人,现在为aws cloudformation validate-template,它仅验证您的模板是有效的JSON还是YAML,而不验证您的键和值是否正确(例如,不检查键中的拼写错误)。
丹尼尔·卡茨

1
由于某种原因,它似乎忽略了行长,例如Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]。根据validate-template命令,这不是问题,但是UI返回此错误。
030

2
如果此工具仅执行文件格式验证,则不执行;jsonlintyamllint是否足够?同样,此工具的文件大小限制为51,200字节。
Siva Senthil

23

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


3
“哇,管理1000行JSON文件肯定很可惜”-当然,这就是为什么创建嵌套堆栈的原因?;-)尽管我同意-对流层有些可怕!
YFP 2014年

10

如何提高模板调试过程的速度,还是在错误发生半小时后就永远留意我的错误?

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

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

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

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

隔离测试资源

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

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

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

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

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

监视堆栈更新进度

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


关于CloudFront及其花费的时间,您是否知道堆栈处于完成状态,而无需等待,我想获取输出,但在我的情况下无需等待部署分发
mcfedr


5

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

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

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


1
根本不是一个可笑的建议。我不确定是否可以不突出语法就进行编码。
克里斯托弗·

2
CFN的预览显示了您将要创建的所有资源,并且还将告诉您堆栈将花费多少。我正在使用Java API,因此不确定在CLI上是否可用,但是请尝试以下操作:link
iGili

4

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


4

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

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

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

此处介绍了其他机制,例如预提交Git钩子

Visual Studio Code扩展示例屏幕截图


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/之类的工具或实际的版本控制系统,以确保您不会意外更改可能破坏脚本的内容。



1

去年12月,Cloudformation新增了一项新功能,即增加了其他参数类型。这些新类型使您的模板能够执行更强大的数据检查,并且在创建资源和嵌套的Cloudformation堆栈时也可以“快速失败”。当使用新的ConstraintDescription属性传入无效值时,您还可以提供更好的人类可读的自定义错误消息。

这些新类型在处理各种VPC资源时特别有用。您可以确保模板的参数是正确的类型,并且对于期望单个值还是列表是明确的。

例如:

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


0

您还可以在以下位置使用亚马逊提供的CloudFormation Designer:https://console.aws.amazon.com/cloudformation/designer/home?region = us-east-1

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

希望这可以帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.