AWSは、CloudFormation Guardのバージョン2をリリースした。これはCloudFormationテンプレートを検証するためのオープンソースツールである。このリリースでは、タイプブロック、連言標準形のサポート、フィルター、名前付きルールなど、多数の新機能が導入されている。
Guardを使うと、ポリシーをコードとして記述できる。そして、このポリシーを使って、どのような形式のJSONファイルまたはYAMLファイルでも検証できる。これらのルールを使って、CloudFormation ChangeSets、Terraform JSON configuration構成ファイル、Kubernetes構成などのInfrastructure-as-Codeファイルをいくつでも検証できる。例えば、GuardをCIパイプラインに接続して、デプロイメントに移行する前にChangeSetが安全であることを検証できる。
このリリースでは、タイプブロックを使ってルールを記述できるようになった。これにより、句の間に暗黙のAND
を使って、より簡潔なルールを記述できる。たとえば、ボリュームタイプがGP2でサイズが10GB未満の、すべてのEC2ボリュームが暗号化されているかどうかを検証するには、次のように記述できる。
AWS::EC2::Volume {
Properties {
Encrypted == true
Size <= 10
VolumeType == 'gp2'
}
}
連言標準形(CNF)がサポートされるようになり、タイプブロック内にOR
句を含めることができるようになった。上記の例は、GP2またはGP3ボリュームタイプのいずれかを許可するように変更できる。
AWS::EC2::Volume {
Properties {
Encrypted == true
Size <= 10
VolumeType == 'gp2' OR
VolumeType == 'gp3'
}
}
上記の例は、新しいIN
演算子を使って記述することもできる。IN
演算子を使うと、チェックする有効なオプションのリストを指定できる。
AWS::EC2::Volume {
Properties {
Encrypted == true
Size <= 10
VolumeType in ['gp2', 'gp3']
}
}
フィルタリングと名前付きルールセットがサポートされるようになった。タイプブロックは、リソースのタイプによってのみ一致する簡略フィルターである。ルールに名前を付けると、ファイル内でルールブロックを再利用できる。AWSのシニアディベロッパーアドボケートであるMatteo Rinaudo氏は、次のように述べている。
フィルタと名前付きルールは、Guard 2.0で句を表現するための規定された方法です。両方の機能を使って、読みやすさを向上させ、リファクタリングをサポートし、高次の句のルールを再結合する際の完全な柔軟性を可能にします。
たとえば、リソースにタグが付いていることを検証するには、次の名前付きルールを定義できる。
rule assert_all_resources_have_non_empty_tags {
Resources.*.Properties.Tags !empty
}
このルールは、DynamoDBテーブルに少なくとも1つのタグがあり、暗号化されていることを検証する、より大きなルール内で使用できる。
let ddb = Resources.*[ Type == 'AWS::DynamoDB::Table' ]
rule dynamo_db_sse_on when %ddb !empty {
assert_all_resources_have_non_empty_tags
%ddb.Properties.SSESpecification.SSEEnabled == true
}
説明やパラメータなど、テンプレート内の任意のセクションで検証を実行できるようになった。ユニットテストをルールに対して記述して、それが必要に応じて機能することを検証できる。テストデータファイルは、必要なリソースをモックし、ルール評価の期待される結果を含むJSONまたはYAMLファイルである。
CloudFormation Guardはオープンソースであり、GitHubから入手できる。