- はじめに
- 結論
- 具体的な設定方法
- 対象リソースの JSON を確認する
- パターン1 (ECR Repository)
- パターン2(Cognito IdentityPool)
- パターン3(EventBridge)
- おまけ:複数リソース・複数タグを検知する場合
- まとめ
はじめに
みなさんは AWS リソースのタグ運用をされていますでしょうか。 タグはリソース管理やコスト分析などに活用でき、適切に運用することで環境の可視性が大きく向上します。 しかし、タグ運用を定着させるためには「タグの付け忘れ」を防止する仕組みが必要です。 AWS Config には、指定したタグが付与されているかをチェックできるマネージドルールが用意されています。
ただし、このマネージドルールでは対応できないリソースも存在します。そのような場合、Guard を利用した Custom Policy Rule を作成するケースがあります。 今回は、Guard を利用してタグ検知を行う際の注意点についてまとめます。
結論
先に結論です。
Guard は「実際のリソース」を見ているのではなく、
AWS Config が保持している構成 JSON を評価している
つまり、構成 JSON にタグ情報が含まれていればカスタムルールで検知できますが、
JSON に反映されていなければ検知はできません。
具体的な設定方法
文章だけでは分かりづらいため、実際のパターンを見ていきます。
なお、本記事では具体的な AWS Config ルールの作成手順は割愛し、Guard の記載方法にフォーカスします。
対象リソースの JSON を確認する
Guard ルールを書く前に、必ず確認すべきことがあります。
AWS Config
└ リソース
└ 対象リソース
└ 設定項目(JSON)の表示

「設定項目」に表示される JSON が Guard の評価対象です。
確認時は、事前に対象リソースへタグを付与しておきましょう。
パターン1 (ECR Repository)
例として、ECR の Repository に Billing と System のタグを付与した場合の JSON です(タグ関連部分のみ抜粋)。
{ "resourceType": "AWS::ECR::Repository", "tags": { "Billing": "", "System": "" } }
このように tags 配下にキーが存在していれば、以下のようなGuard で記載することでタグ検知が可能です。
rule check_required_tag when resourceType IN [
"AWS::ECR::Repository"
]
{
tags.Billing exists
}
パターン2(Cognito IdentityPool)
次に、Cognito IdentityPool に Billing と System のタグを付与した場合の JSON です。
{ "resourceType": "AWS::Cognito::IdentityPool", "tags": {}, "configuration": { "IdentityPoolTags": [ { "Key": "Billing", "Value": "" }, { "Key": "System", "Value": "" } ] } }
この場合、タグは tags 配下ではなく、configuration.IdentityPoolTags に格納されています。
そのため Guard の記載も異なります。
rule check_required_tag_for_identity_pool when resourceType IN [
"AWS::Cognito::IdentityPool"
]
{
some configuration.IdentityPoolTags[*].Key == "Billing"
some configuration.IdentityPoolTags[*].Key == "System"
}
リソースごとに JSON の構造が異なるため、注意が必要です。
パターン3(EventBridge)
EventBridge のルールに Billing と System のタグを付与した場合の JSON を確認しました。

しかし、タグを付与しているにもかかわらず、
Config の構成 JSON にタグ情報が反映されていませんでした。

この場合、Guard ではタグ検知ができません。
つまり、
- タグは付与できる
- しかし Config がタグ情報を保持していない
- よって Guard では評価できない
という状況になります。
おまけ:複数リソース・複数タグを検知する場合
複数リソースで複数タグを検知する場合の Guard の書き方を紹介します。 パターン1、パターン2のような場合を考慮して記載すると以下のような書き方になります。
rule check_required_tag when resourceType IN [
"AWS::ECR::Repository"
]
{
tags.Billing exists
tags.System exists
}
rule check_required_tag_for_identity_pool when resourceType IN [
"AWS::Cognito::IdentityPool"
]
{
some configuration.IdentityPoolTags[*].Key == "Billing"
some configuration.IdentityPoolTags[*].Key == "System"
}

まとめ
Guard は非常に強力ですが、前提があります。
- 評価対象は「Config の JSON」
- JSON にタグが含まれていなければ評価できない
- タグの格納パスはリソースごとに異なる
Guard でタグ統制を実装する場合は、
- まず Config の JSON を確認する
- タグの格納パスを把握する
- それに合わせて Guard を記述する
この順番で進めることが重要です。
タグガバナンスを設計する際の参考になれば幸いです。