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

时间:2012-08-07 22:04:47

标签: amazon-web-services amazon-cloudformation

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包裹退出消息,然后将它们像一艘正在下沉的船上的压载物一样扔掉。如何更快地完成模板调试过程,或者在制作模板半小时后我是否会永远注意到我的错误?

12 个答案:

答案 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模板开发的迭代速度:

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

AWS已在其自己的Best Practices文档中概述了这些内容,因此我不再重复这些内容:

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

隔离测试资源

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

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

以小增量构建复杂的堆栈

执行堆栈创建/更新时,任何单个资源中的失败都会导致堆栈回滚整组资源更改,这可能会不必要地破坏其他成功创建的资源,并且在构建复杂堆栈时需要很长时间使用相关资源的长依赖图。

解决方法是在较小的更新批次中逐步构建堆栈,一次添加一个(或几个)资源。这样,如果/当资源创建/更新中发生故障时,回滚不会导致整个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之外的其他静态分析:

https://github.com/aws-cloudformation/cfn-python-lint/

https://aws.amazon.com/blogs/mt/git-pre-commit-validation-of-aws-cloudformation-templates-with-cfn-lint/