有没有办法对AWS Cloudformation模板进行单元测试

Ara*_*nde 29 unit-testing amazon-web-services aws-cloudformation

当我们说cloudformation是'Infrastructure as Code'时,立即想到的下一个问题是如何测试这些代码.我们可以对此代码进行某种基本的单元测试

我正在对云形式验证进行折扣,因为这只是一种进行语法验证的方法,而且我可以使用任何其他免费的JSON/YAML验证器.

我更倾向于某种功能验证,可能测试我已经定义了所有用作引用的变量.可能测试我正在使用的任何属性实际上是该组件支持的属性

不期望它应该测试权限是否正确或我没有用尽我的限制.但至少除了基本的JSON/YAML语法验证之外

wjo*_*dan 31

以下是如何将多种测试软件方法应用于CloudFormation模板/堆栈的细分:

掉毛

对于linting(检查CloudFormation模板代码的语法/语法正确性),您可以使用ValidateTemplate API检查基本模板结构,并使用CreateChangeSetAPI更详细地验证您的资源属性.

  • 请注意,ValidateTemplate执行比简单的JSON/YAML语法检查程序更彻底的检查 - 它验证正确的模板解剖,正确的内部函数的语法/用法,以及正确的所有Ref值的解析.
  • ValidateTemplate检查基本的CloudFormation语法,但不会针对特定的属性架构验证模板的资源.要根据AWS资源类型检查模板的参数,资源和属性的结构,CreateChangeSet如果任何参数或资源属性格式不正确,则应返回错误.

单元测试

首先执行单元测试需要回答问题:可以/应该测试的最小的独立功能单元是什么?对于CloudFormation,我认为最小的可测试单元是Resource.

官方AWS资源类型由AWS支持/维护(无论如何都是专有实现),因此不需要由最终用户开发人员编写的任何其他单元测试.

但是,您自己的自定义资源可以并且应该进行单元测试.这可以使用实现自己语言中的合适测试框架来完成(例如,对于Lambda支持的自定义资源,可能lambda-tester是一个很好的起点).

集成测试

这是CloudFormation堆栈最重要和最相关的测试类型(主要用于将各种资源整合到一个集成的应用程序中),以及可以使用更多细化和最佳实践开发的类型.以下是关于如何通过实际创建/更新包含真实AWS资源的完整堆栈来集成测试CloudFormation代码的一些初步想法:

  • 使用脚本语言,使用语言的AWS SDK执行CloudFormation堆栈创建.设计模板以返回反映您要测试的行为的堆栈输出.在通过脚本语言创建堆栈之后,将堆栈输出与预期值进行比较(然后可选择在清理过程中删除堆栈).
  • 使用AWS::CloudFormation::WaitCondition资源来表示成功的测试/断言,以便成功的堆栈创建表明成功的集成测试运行,并且失败的堆栈创建表明集成测试运行失败.

除了CloudFormation之外,在测试基础架构作为代码的空间中值得一提的一个有趣的工具是Test Kitchen的kitchen-terraform一组插件,它允许您为Terraform模块编写全自动集成测试套件.最终可以为CloudFormation构建类似的集成测试工具,但尚不存在.

  • 只是添加到这个答案 - 谢谢@wjordan,对我帮助很大:我最近意识到 AWS 快速入门团队的 TaskCat:https://github.com/aws-quickstart/taskcat (3认同)
  • 对于基本的lint,我想检查所有`required`属性是否存在,但是`aws cloudformation validate-template`不存在,例如,当我验证没有通过CidrBlock的`AWS :: EC2 :: VPC'时。我是否丢失了某些东西,或者这是我正在使用的AWS CLI版本(1.14.26)中的错误吗? (2认同)
  • @KevinCross`ValidateTemplate`仅在本地验证基本CloudFormation语法,它不会针对特定资源模式验证您的模板。要实际验证模板的资源和属性,可以使用[`CreateChangeSet`](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateChangeSet.html)API(例如,[`aws cloudformation create使用CLI的-change-set`](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html)。我将更新答案以包括这些额外信息。 (2认同)

小智 7

此工具"cfn-nag"解析CloudFormation模板的集合,并应用规则来查找可能导致不安全的基础结构的代码模式.该工具的结果包括违反资源的逻辑资源标识符以及违反规则的解释.进一步阅读:https://stelligent.com/2016/04/07/finding-security-problems-early-in-the-development-process-of-a-cloudformation-template-with-cfn-nag/

虽然该工具会尝试匹配许多特定规则,但粗略的类别是:

IAM和资源策略(S3 Bucket,SQS等)匹配以某种方式过度宽松的策略(例如,动作或主体中的通配符)

安全组入口和出口规则匹配过于宽松的规则(例如,入口规则打开到0.0.0.0/0,端口范围1-65535打开)

访问日志查找未启用适用资源的访问日志(例如Elastic Load Balancers和CloudFront Distributions)

未对适用资源启用或强制执行的加密(服务器端)加密(例如,EBS卷或S3存储桶上的PutObject调用)