Guardを使用したAWS Configカスタムルールにおいて特定のプレフィックスと一致するリソースの評価結果のみを表示させる方法の一例

2023.02.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Guard を使用した AWS Config カスタムルールにおいて、特定のプレフィックスと一致するリソースの評価結果のみをマネジメントコンソールに表示させる方法の一例を紹介します。今回の例では、S3 バケット名がtest-から始まるバケットのみを評価結果画面に表示させてみます。

Guard を用いた Config カスタムルールの基本的な内容については次のブログで紹介されています。

実現例

次の 4 つの S3 バケットに対してバージョニング設定が有効になっているかどうかをチェックして、test-から始まる 2 つのバケットのチェック結果のみを表示させるようにします。

  • test-bucket-20230205
  • test-bucket-20230205-versioning (バージョニングが有効)
  • dev-bucket-20230205
  • dev-bucket-20230205-versioning (バージョニングが有効)

次の Guard コード例で実現できます。3 行目でバケット名がtest-から始まるかどうかを確認して、FAIL の場合は rule ブロックの中を処理しないように(SKIP するように)しています。

let resource_name = resourceId

rule s3_versioning_check when %resource_name == /^test-.*$/ {
    supplementaryConfiguration.BucketVersioningConfiguration.status == "Enabled"
}

処理が SKIP されたことにより、マネジメントコンソールの Config ルールの評価結果画面ではtest-から始まる 2 つのバケットのみが表示されるようになります。

なお、単純な次のルールで評価した場合はtest-から始まるバケット以外も結果画面に表示されます。

rule s3_versioning_check {
    supplementaryConfiguration.BucketVersioningConfiguration.status == "Enabled"
}

4 つのバケットの評価結果がすべて表示されるためtest-から始まるバケットだけをチェックしたい場合は視認性が悪くなります。

今回はプレフィックスの一致を試しましたが、正規表現で評価できるため、他の規則との一致も実現可能です。EC2 インスタンスの場合は Name タグの値を利用するなどの検討も必要となってきます。

また、評価結果が表示されないだけであり、表示されていない S3 バケットも評価されています(詳細は後述しています)。

なぜ評価結果に表示されないのか

Guard ルールの評価結果には PASS/FAIL/SKIP があります。このうち、最終評価が SKIP の場合はマネジメントコンソールには表示されないようです。

実現例では、意図的に評価結果が SKIP となるようにしています。3 行目のリソース名(バケット名)のチェックが FAIL の場合は rule ブロック内の評価が実施されないため、最終的に SKIP の評価結果となります。

let resource_name = resourceId

rule s3_versioning_check when %resource_name == /^test-.*$/ {
    supplementaryConfiguration.BucketVersioningConfiguration.status == "Enabled"
}


whenを利用したときの評価ロジックは次のドキュメントに説明があります。

Composing named-rule blocks in AWS CloudFormation Guard - AWS CloudFormation Guard


もし他の設定のチェックも合わせて実施したい場合は、次の記載ができました。1 つ目の rule ブロックの結果が PASS のときに 2 つ目の rule ブロックの中が評価されるようにwhenを利用しています。もしtest-から始まらないバケットの場合は、1 つ目の rule ブロックの結果が SKIP となり、2 つ目の rule ブロックの結果も SKIP となります。

let resource_name = resourceId

rule s3_versioning_check when %resource_name == /^test-.*$/ {
    supplementaryConfiguration.BucketVersioningConfiguration.status == "Enabled"
}

rule s3_lifecycle_check when s3_versioning_check {
    supplementaryConfiguration.BucketLifecycleConfiguration exists
}


注意点として、マネジメントコンソール上で評価結果が表示されないだけであり、評価自体は実施されています。

デバッグログを確認すると分かるのですが、下記のログの通りtest-から始まらないdev-bucket-20230205-versioningバケットも評価されており、not_applicableの結果となっています。

ConfigRuleId: config-rule-9escqf, ResourceType: AWS::S3::Bucket, ResourceId: dev-bucket-20230205-versioning
{
    "not_compliant": {},
    "not_applicable": [
        "s3_versioning_check"
    ],
    "compliant": []
}

そのため、評価を実施するリソースを限定する方法ではない点に注意が必要です。評価されるため課金対象となります。

評価対象としたいリソースが 1 つのとき

評価対象としたいリソースが 1 つのときは Guard 側で対応しなくても「リソース識別子」のオプション設定が利用できます。Guard ルールを作成する際に評価対象のリソース識別子を指定するだけなので簡単です。

トリガー設定でリソース識別子を設定する例です。

「リソース識別子」設定でリソースを限定しているため、Guard ルールは次の内容でも問題ありません。

rule s3_versioning_check {
    supplementaryConfiguration.BucketVersioningConfiguration.status == "Enabled"
}

評価結果画面では「リソース識別子」で指定したバケットのみが表示されています。

なお、「リソース識別子」設定を利用した場合は、CloudWatch Logs に記録されているログはtest-bucket-20230205バケットに対する評価のみでした。そのため、すべてのバケットが評価されていないと思われます。

おわりに

Guard を使用した AWS Config カスタムルールにおいて、S3 バケット名が特定の文字列から始まるバケットのみをマネジメントコンソールの評価結果画面に表示させる方法の一例を紹介しました。他にも実現する方法はありそうです。

始めは実現方法が分からず、少し悩んだためブログ化しました。このブログがどなたかのご参考になれば幸いです。