AWS发布CloudFormation Guard第二版,引入许多新功能

397 阅读2分钟

AWS发布了CloudFormation Guard的第二版,这是他们用于验证CloudFormation模板的开源工具。该版本引入了许多新功能,包括类型块、支持共轭正态形式、过滤器和命名规则。

Guard可以编写策略即代码,然后可以用来验证任何格式良好的JSON或YAML文件。这些规则可用于验证任何数量的基础设施即代码文件,包括CloudFormation ChangeSetsTerraform 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 获得。

原文链接:www.infoq.com/news/2021/0…