AWS发布了CloudFormation Guard的第二版,这是他们用于验证CloudFormation模板的开源工具。该版本引入了许多新功能,包括类型块、支持共轭正态形式、过滤器和命名规则。
Guard可以编写策略即代码,然后可以用来验证任何格式良好的JSON或YAML文件。这些规则可用于验证任何数量的基础设施即代码文件,包括CloudFormation ChangeSets、Terraform JSON configuration文件,或Kubernetes configurations。例如,Guard可以被连接到CI管道中,以验证ChangeSets在进入部署之前是安全的。
在此版本中,现在可以使用类型块编写规则。这使得编写的规则更加简洁,子句之间隐含 "AND"。例如,要验证所有EC2卷是否加密,如果卷的类型是GP2,大小小于10GB,你现在可以写。
AWS::EC2::卷 {
属性 {
加密 == true
大小 <= 10
VolumeType == 'gp2'
}
}
由于增加了对共轭正态形式(CNF)的支持,现在可以在类型块中包含OR
子句。上面的例子可以被调整为允许GP2或GP3卷类型。
AWS::EC2::卷 {
属性 {
加密的 == true
大小 <= 10
VolumeType == 'gp2' OR
VolumeType == 'gp3'
}
}
上面的例子也可以用新的IN
操作符来写。IN
操作符允许指定一个有效的选项列表,以便进行检查。
AWS::EC2::卷 {
属性 {
加密 == true
大小 <= 10
VolumeType 在 ['gp2', 'gp3'] 中
}
}
现在支持过滤和命名规则集。类型块是一个简短的过滤器,只按资源的类型进行匹配。命名规则允许在整个文件中重复使用规则块。正如AWS的高级开发者倡导者Matteo Rinaudo所指出的。
过滤器和命名规则是Guard 2.0中表达条款的规定方式。使用这两种功能可以提高可读性,支持重构,并允许完全灵活地重新组合高阶条款的规则。
例如,为了验证资源上是否有任何标签,可以定义以下命名规则。
规则 assert_all_resources_have_non_empty_tags {
资源.*.属性.标签 !空
}
然后,这个规则可以在一个更大的规则中使用,验证DynamoDB表至少有一个标签,并且也是加密的。
let ddb = Resources.*[ Type == 'AWS::DynamoDB::Table' ] 。
规则 dynamo_db_sse_on 当 %ddb !"空" {
assert_all_resources_have_non_empty_tags
%ddb.Properties.SSESpecification.SSEEnabled == true
}
现在可以对模板内的任何部分进行验证,包括描述和参数。可以针对规则编写单元测试,以验证它们是否能如愿工作。测试数据文件是一个JSON或YAML文件,模拟必要的资源,包括规则评估的预期结果。
CloudFormation Guard是开源的,可通过 GitHub 获得。