AWS Configのルールで非準拠判定されたらメール通知したい

記事タイトルとURLをコピーする

こんにちは、矢野(喬)です。

以前は高かったAWS Configのルールの費用が大幅に引き下げられてから、利用される方も増えてきたのではないかと思います。
本記事ではAWS Configのマネージドルールのひとつである「required-tags」を設定し、ルール評価対象とするリソースが非準拠判定された時に、Eメールで通知されるようにしてみました。
相変わらず親切なAWS公式に記事がありましたので参考にしつつ進めてみます。

aws.amazon.com

構成図

f:id:swx-kyosuke-yano:20210327110712p:plain

AWS Configルールを「required-tags」で新規作成し、EC2インスタンスとS3バケットのタグに「Name」「Application」の2つが含まれているかを判定します
判定がNGであった場合にAmazon EventBridge(以降 EventBridge)が検知し、紐付けられたAmazon SNS (以降 SNS)を使ってEメールが対象者に通知される仕組みです

構築順

1.AWS Configルールの作成
2.SNSトピックの作成
3.EventBridgeルールの作成
4.動作確認

環境構築手順詳細

1.AWS Configルールの作成

1-1.AWS Configに移動し「ルールを追加」をクリック

f:id:swx-kyosuke-yano:20210327111626j:plain

1-2.ルールタイプをAWSマネージド型にして「required-tags」を選択し「次へ」で進む

f:id:swx-kyosuke-yano:20210327111819j:plain

1-3.「ルールの設定」で以下のように指定し「次へ」で進む


今回はNameタグとApplicationタグが指定したリソースに含まれているかどうかの判定とすることにします

  • 名前
    • 任意でOK(本記事では required-tags)
  • 説明
    • 任意でOK(本記事はいじらずそのまま)

f:id:swx-kyosuke-yano:20210327112707j:plain

  • 変更範囲
    • リソース
  • リソース
    • 今回はEC2 Instance、EC2 Volume、S3 Bucket以外を「✕」で消しました

f:id:swx-kyosuke-yano:20210327112917j:plain

  • パラメータキー
    • tag1Key
      • Name
    • tag1Value
      • 任意にしたいので記載せず
    • tag2Key
      • Application
    • tag2Value
      • 任意にしたいので記載せず
    • 以降全て記載せず

f:id:swx-kyosuke-yano:20210327113114j:plain

1-4.設定内容を確認し「ルールを追加」をクリック

f:id:swx-kyosuke-yano:20210327113427j:plain f:id:swx-kyosuke-yano:20210327113431j:plain
問題無く作成されたことを確認
f:id:swx-kyosuke-yano:20210327113544j:plain

2.SNSトピックの作成

2-1.SNSに移動し、「トピックの作成」をクリック

f:id:swx-kyosuke-yano:20210327193415j:plain

2-2.以下の通り設定しトピックを作成


メール件名である程度わかるように名前を設定します

  • タイプ
    • スタンダード
  • 名前
    • 任意でOK (本記事では AWSConfig-NON_COMPLIANT )
  • 表示名
    • 任意でOK (本記事では AWSConfig-NON_COMPLIANT )

f:id:swx-kyosuke-yano:20210327193710j:plain

2-3.作成したトピックにサブスクリプションを登録


サブスクリプションタブから「サブスクリプションの作成」をクリック
f:id:swx-kyosuke-yano:20210327193837j:plain
プロトコルに「Eメール」、エンドポイントに送りたい宛先(本記事では自身に届くようにします)を入力し「サブスクリプションの作成」をクリック
f:id:swx-kyosuke-yano:20210327194201j:plain

2-4.サブスクリプションの有効化


登録したサブスクリプションは承諾する必要があり、それまではステータス「保留中の確認」となり利用出来ません
f:id:swx-kyosuke-yano:20210327194317j:plain
作成時に記載したエンドポイント(Eメールアドレス)に確認メールが届いていることを確認。「Confirm subscription」で承諾
f:id:swx-kyosuke-yano:20210327194446j:plain f:id:swx-kyosuke-yano:20210327194551j:plain
ステータスが「確認済み」になることが確認できればOK
f:id:swx-kyosuke-yano:20210327194555j:plain

3.EventBridgeルールの作成

3-1.EventBridgeに移動し「ルールを作成」をクリック

f:id:swx-kyosuke-yano:20210327194723j:plain

3-2.以下の通り設定し、ルールを作成


  • 名前
    • 任意でOK (本記事では notice-Config)

f:id:swx-kyosuke-yano:20210327195037j:plain

  • パターン
    • イベントパターン
  • イベント一致パターン
    • カスタムパターン

f:id:swx-kyosuke-yano:20210327195100j:plain

記載内容はこちら
required-tagsというルールでNON_COMPLIANT判定された時に一致するようにします

{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "messageType": ["ComplianceChangeNotification"],
    "configRuleName": ["required-tags"],
    "newEvaluationResult": {
      "complianceType": ["NON_COMPLIANT"]
    }
  }
}
  • ターゲット
    • SNSトピック
  • トピック
    • 作成したSNSトピック(AWSConfig-NON_COMPLIANT)
  • 入力の設定
    • 入力トランスフォーマー

f:id:swx-kyosuke-yano:20210327195424j:plain

記事を参考にパスはこちら

{
        "awsRegion": "$.detail.awsRegion",
        "resourceId": "$.detail.resourceId",
        "awsAccountId": "$.detail.awsAccountId",
        "compliance": "$.detail.newEvaluationResult.complianceType",
        "rule": "$.detail.configRuleName",
        "time": "$.detail.newEvaluationResult.resultRecordedTime",
        "resourceType": "$.detail.resourceType"
}

テンプレートはこちら
「" "」で囲まないとうまく改行して記載できないとこちらの記事に記載されていましたので注意

注意: 改行を含むテンプレートを保存する際に Invalid InputTemplate エラーが表示された場合は、各行は必ず二重引用符で閉じるようにしてください

"発生時刻 : <time>"
"ルール名 : <rule> "
"リソースタイプ : <resourceType>"
"リソースID : <resourceId>"
"AWSアカウント : <awsAccountId>"


"上記リソースが <compliance> 判定となりました。"
"詳細は以下URLよりご確認ください。"
"https://console.aws.amazon.com/config/home?region=<awsRegion>#/timeline/<resourceType>/<resourceId>/configuration"

これで準備が整いました

4.動作確認

4-1.元々ルールに準拠していたリソースを非準拠へ


「Name」「Application」タグを持っているS3バケットのタグを編集します
f:id:swx-kyosuke-yano:20210328001615j:plain f:id:swx-kyosuke-yano:20210328001618j:plain
f:id:swx-kyosuke-yano:20210328001621j:plain 現在はタグがルールに準拠している状態です。AWS Configルール画面のコンプライアンスステータスが「準拠」として判定されています f:id:swx-kyosuke-yano:20210328001623j:plain
ここから「Application」タグを消してみます f:id:swx-kyosuke-yano:20210328001627j:plain
消した後はしばらく待機。。。。。
すると、(ルール非準拠判定がEventBridge→SNSと伝わり)以下メールが届きました
f:id:swx-kyosuke-yano:20210328002135j:plain
AWS Configルール画面のコンプライアンスステータスも「非準拠」として判定されていることがわかります f:id:swx-kyosuke-yano:20210328002138j:plain
リソース変更によるルール非準拠時に通知されることが確認できました

4-2.ルール非準拠のリソースを作成


判定するリソースの一つであるEC2 Volumeで確認してみます
EC2に移動し適当なスナップショットを右クリック→ボリュームの作成をクリックし、「Name」タグだけを付与して作成してみます
f:id:swx-kyosuke-yano:20210328002717j:plain f:id:swx-kyosuke-yano:20210328003340j:plain f:id:swx-kyosuke-yano:20210328003344j:plain
ここでしばし待機。。。。。
2~3分後に以下のようにメールが届きました。ボリュームがきちんとルール非準拠判定されたようです
さらに始めにご紹介したこの記事のテンプレートを参考にして作ったリンクをクリックしてみます f:id:swx-kyosuke-yano:20210328003348j:plain
↓の通りAWS Configの該当リソースがいつどのルールが原因で非準拠となったかがわかるページに飛ぶことができました(助かる)

f:id:swx-kyosuke-yano:20210328003351j:plain
新規作成したリソースの判定も問題ないことがわかりました

おまけ

今回SNSで送る文面用に入力トランスフォーマーでは項目を絞って値を取得していましたが、他の項目も気になったので確認してみました
この項目内から必要な値を取得して、必要な内容を含んだメール文面を作成することになります
(記事の項目で十分そうですが気になったので)

{
  "version": "0",
  "id": "XXXXX",
  "detail-type": "Config Rules Compliance Change",
  "source": "aws.config",
  "account": "AWSアカウント番号",
  "time": "2021-03-24T11:08:34Z",
  "region": "ap-northeast-1",
  "resources": [],
  "detail": {
    "resourceId": "S3バケット名",
    "awsRegion": "ap-northeast-1",
    "awsAccountId": "AWSアカウント番号",
    "configRuleName": "required-tags",
    "recordVersion": "1.0",
    "configRuleARN": "arn:aws:config:ap-northeast-1:AWSアカウント番号:config-rule/config-rule-XXXXX",
    "messageType": "ComplianceChangeNotification",
    "newEvaluationResult": {
      "evaluationResultIdentifier": {
        "evaluationResultQualifier": {
          "configRuleName": "required-tags",
          "resourceType": "AWS::S3::Bucket",
          "resourceId": "S3バケット名"
        },
        "orderingTimestamp": "2021-03-24T11:08:25.808Z"
      },
      "complianceType": "NON_COMPLIANT",
      "resultRecordedTime": "2021-03-24T11:08:33.749Z",
      "configRuleInvokedTime": "2021-03-24T11:08:33.572Z"
    },
    "oldEvaluationResult": {
      "evaluationResultIdentifier": {
        "evaluationResultQualifier": {
          "configRuleName": "required-tags",
          "resourceType": "AWS::S3::Bucket",
          "resourceId": "S3バケット名"
        },
        "orderingTimestamp": "2021-03-24T07:22:25.230Z"
      },
      "complianceType": "COMPLIANT",
      "resultRecordedTime": "2021-03-24T11:07:29.843Z",
      "configRuleInvokedTime": "2021-03-24T11:07:29.660Z"
    },
    "notificationCreationTime": "2021-03-24T11:08:34.572Z",
    "resourceType": "AWS::S3::Bucket"
  }
}

料金

実際に今回の一連の作業で追加費用が掛かるか調べてみます
東京リージョンの場合

Config

  • 料金 - AWS Config | AWS
    • AWS リージョンごとに、AWS アカウントに記録された設定項目あたり 0.003USD
    • 最初の 100,000 件のルール評価        リージョンごとのルール評価ごとに 0.001USD

ルール追加によるリソースの設定項目の増加 * 0.003USDを注意しておけば良さそうです

EventBridge

→ AWS内のリソースのイベントなので考慮不要のようです

SNS

  • 料金 - Amazon SNS | AWS
    • Email/Email-JSON        無料1,000 件の通知        2.00USD/10 万通知
    • データ受信        すべてのデータ受信        0.00USD/GBデータ送信 ***        1 GB/月まで        0.00USD/GB
    • 毎月最初の 100 万 Amazon SNS リクエストは無料です。この上限を超えた後の料金は 100 万 リクエストごとに 0.50USD

→ 仮に10万リクエスト、Email1000通、サイズ1GBとしても、無料利用枠により費用は0円。非準拠の判定だけで費用が掛かる程使われることは無さそうです

おわりに

やりたいことAWS公式様がまとめてくれていたので、スムーズに実装することができました

SNSの文章も一緒にEventBridgeルールで加工出来てしまうのは非常に便利なので、色々と応用が効きそうです
判定するリソースの項目数が費用に直結しているので、その点にはご注意ください
ありがとうございました。

矢野 喬亮 (記事一覧)

クラウドインテグレーション部

ウクレレと陶芸とMediaServicesが好きです