92

CloudFormation 是一种强大的 AWS 产品,允许通过单个 API 调用以编程方式创建 AWS 资源堆栈,例如应用程序的Web层、高性能计算集群整个应用程序堆栈。它非常强大。使用它肯定被认为是一种良好的 AWS 实践,尤其是当它与Chef、 Puppetcloud-init 结合使用时。调试它使我陷入困境。

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

我错过了什么?我知道--disable-rollback国旗,并像氧气一样使用它。我很久以前就学会了用包裹退出消息cfn-signal并将它们像压舱物一样扔下沉船。我怎样才能使模板调试过程更快,或者在我犯错半小时后我会永远卡住我的错误?

4

12 回答 12

48

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

于 2012-09-01T21:56:06.617 回答
25

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

于 2013-07-11T21:54:54.457 回答
14

我怎样才能使模板调试过程更快,或者在我犯错半小时后我会永远卡住我的错误?

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

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

AWS 已经在其自己的最佳实践文档中概述了这些内容,因此我不会重复它们:

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

隔离测试资源

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

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

以小增量构建复杂的堆栈

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

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

监控堆栈更新的进度

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

于 2017-01-02T03:58:35.140 回答
10

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

于 2013-07-11T15:59:45.130 回答
6

AWS CloudFormation linter提供额外的静态分析aws cloudformation validate-template

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

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

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

Visual Studio Code 扩展示例截图

于 2019-06-11T03:36:15.950 回答
5

聚会迟到了,但我可能还要补充一点,花一点时间配置和学习你的编辑器是值得的。我知道这听起来很简单,但请尝试一下。

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

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

于 2013-07-11T14:02:39.097 回答
4

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

于 2017-06-28T23:24:39.230 回答
2

如果您正在处理 EC2 机器,那么我建议您登录到 EC2 机器并跟踪 boot.log 文件(RHEL6/Centos 中的 /var/log/boot.log)。该文件会随您的所有 shell 活动(如:安装、下载文件、复制文件等活动)进行更新。

此外,使用http://www.jsoneditoronline.org/之类的编辑器来获取 JSON 的树表示。这有助于您检查 JSON 元素的顺序。

当您更新文件时,请始终使用http://www.git-tower.com/blog/diff-tools-mac/之类的工具或实际的版本控制系统,以确保您不会意外更改可能会破坏脚本的内容。

于 2014-11-18T00:55:19.783 回答
2

除了 AWS CLIaws cloudformation validate-template命令之外,还有一个基于节点的cfn-check工具可以进行更深入的验证。

于 2017-06-28T23:21:32.543 回答
1

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

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

例如:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}
于 2015-03-21T05:40:47.053 回答
1

请在https://pypi.org/project/cloudformation-validator/查看我的 cloudformation 验证器

这将验证架构,然后再次验证规则列表,并允许自定义规则。我还允许与部署工具轻松集成。

于 2018-08-09T03:29:42.930 回答
0

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

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

希望这可以帮助。

于 2015-11-18T19:41:43.793 回答