
AWS ConfigカスタムルールをカスタムGuardで試してみる
こんにちは、r.inoです。
今回は、AWS ConfigカスタムルールをカスタムGuardを使用して作成できるか試してみたいと思います。
まず、AWS Configカスタムルールについて紹介です。
AWS Config カスタムルールは、ゼロから作成するルールです。 AWS Config カスタムルールを作成するには、Lambda 関数 (AWS Lambda 開発者ガイド) と、コードpolicy-as-code言語である Guard (Guard GitHub リポジトリ) の 2 つの方法があります。
AWS Config Lambda で作成されたカスタムルールはAWS Config カスタム Lambda ルールと呼ばれ、Guard で作成された AWS Config カスタムルールはAWS Config カスタムポリシールールと呼ばれます。
AWS Config には以下の3種類のカスタムルールがあります。
マネージドルール
AWS が提供する既成ルール
カスタム Lambda ルール
Lambda 関数を使って独自ロジックを記述:Python / Node.js
カスタム Guard ルール
AWS Policy-as-Code(Guard)を使用:Guard(シンプルなルール定義言語)
AWS Config の Custom Guard ルール は、Guard という独自の言語を使用してポリシーを定義します。
やってみる
早速やってみます。「ルールタイプの選択」に「Guardを使用してカスタムルールを作成」にすることでGuardでルールを作成できます。

今回のルールの内容は以下の通りとします。
このルール check_ec2_tag は、EC2インスタンス(AWS::EC2::Instance) に対して次の条件をチェックします。

タグ (tags) が存在すること
resource.tags exists により、少なくとも1つのタグが設定されているかをチェック。
タグ "Environment" の値が "Production" であること
resource.tags["Environment"] == "Production" により、"Environment" というタグがあり、その値が "Production" であることをチェック。
rule check_ec2_tag when resourceType == "AWS::EC2::Instance" {
resource.tags exists
resource.tags["Environment"] == "Production"
}
各行で行っている内容は以下の通りです。
rule <ルール名> when <条件> {} の構文
resource.tags exists を追加 → タグが存在するかチェック
タグの存在チェック後に resource.tags["Environment"] を評価する
Guard ルールの動作
COMPLIANT(準拠)
すべてのEC2が Environment=Production のタグを持っている
NON_COMPLIANT(非準拠)
タグが付いていない EC2 インスタンスがある

リソースをAWS EC2 Instanceとして、「Guard を使用してカスタムルールを作成」を選択する

ルールに作成したものが表示されていれば成功です。

おまけ
ルールの内容として、Guard ルールを色々記載して試していたのですが、Guard 2.x の構文にあったコードを書けずに最初苦戦しました。。

しっかりGuard の構文を理解する必要があるなと思いました。
以下にGuard ルールの記述方法が記載されているので、興味がある方は見てみてください。
今回はAWS Configカスタムルールを作成してみました。
作成する流れは特に止まることはなかったのですが、Guard ルールの記述を少し学んでおく必要があるなと思います。
逆にGuard ルールの記述方法さえ知っていれば、簡単にAWS Configカスタムルールが作成できることに驚きました。より柔軟な対応も取りやすいと思います。
今度は、AWS Config ルールで違反が発生した際にAmazon SNS を使って通知する設定なども行ってみたいと思います。