BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS Config】野良リソース撲滅運動!「特定タグがなければメール通知」をしよう(とりあえず実装編)

はじめに

こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。

みなさん、社内でAWSの環境を運営していますか?
誰が作ったかわからないリソース・いわゆる野良リソースに困った経験はないでしょうか。

インフラがなくてもちゃちゃっと簡単にできちゃうのがクラウドのメリット。
しかしその反面消してもいいのか判断がつかない野良リソースが乱立し、運用期間が長くなるほど使いづらくなってしまいます。
というわけで、この状況を解消すべく以前から考えていた「特定タグがなかったら通知」という機能を入れることにしました。

ちなみに費用想定は月額1000円程度です。

特定タグがなければメール通知する

今回の構築イメージです。
リソースが作成・変更・削除された際に特定タグ [ User ] がないとメールで通知する仕組みです。

AWS Configではサポートされているリソースの記録を取れますが、費用はリージョンごとです。
セキュリティ的には全リージョン取りたいところですが、まずはお試しも込めて東京リージョンに限定します。

① SNSの通知の設定

今回構築する範囲での登場リソースはConfig, EventBridge, SNSの3つ。
こういった連携モノは後ろから構築するという暗黙のルールがありますのでまずはSNSでメール通知する設定を追加します。

  1. SNSではトピック→サブスクリプションの順に作成します。
    左メニュー [ トピック ] から右端ボタン [ トピックの作成 ] を押します。

  2. タイプに [ スタンダード ] を選択、適当な名前を入力、またこのSNSトピック自体も [ User ] タグをつけて [ トピックの作成 ] を押します。

  3. この流れで下の画面に表示される [ サブスクリプションの作成 ] を押します。

  4. トピックARNに先ほど作成したトピック、プロトコルに [ Eメール ] 、エンドポイントに送信先のメールアドレスを入力し、[ サブスクリプションの作成 ] を押します。

  5. 先ほど入力したエンドポイントのメールアドレスにメールの確認が送信されるので、[ Confirm subscription ] を押します。

  6. SNSサブスクリプションの画面が開きます。ステータスが [ 確認済み ] となっていることを確認します。

② EventBridgeの設定

EventBridgeではConfigで非準拠判定となったイベントをトリガーにSNSへメールを送信するように設定します。
この時、Eventの情報をSNSへ渡すために入力トランスフォーマーを利用します。

  1. EventBridgeの左メニュー [ ルール ] からルールセルの [ ルールを作成 ] を押します。

  2. 任意の名前を入力、ルールタイプに [ イベントパターンを持つルール ] を選択し、[ 次へ ] を押します。

  3. イベントパターンで [ カスタムパターン(JSONエディタ) ] を選択、カスタムのイベント(記事の最後を参照)を貼り付け、[ 次へ ] を押します。

  4. ターゲットでは先ほど作成したSNSを選択し、[ 追加設定 ] を開いて [ 入力トランスフォーマー ] を選択します。

  5. [ 入力トランスフォーマーを設定 ] を押します。
    入力パスはConfig非準拠のイベントで流れてくるJSONのkeyに変数を定義します。そうすることでそのkeyに紐づくValueSNSに渡すことができます。ここは公式URLにある参考のJSON(記事の最後を参照)を貼り付けます。
    テンプレートでは入力パスで指定した変数を使ってSNSへ情報を渡します。すべてを入力したら [ 確認 ] 、[ 次へ ] と順に押します。

  6. こちらにもタグ [ User ] を付けて [ 次へ ] を押します。

  7. 入力内容を確認し、[ ルールの作成 ] を押したら完了です。

③ Configの設定

最後にConfigの設定を行います。ConfigにはリージョンでサポートされているAWSリソース(つまりサポートされていないものもある)の設定履歴を保持し、設定変更を追跡できる機能があります。
また「required-tag」という用意されているルールを使用することで、今回の「User」タグがなければダメだよというルールを簡単に作れます。

  1. Config管理画面・左メニュー [ ルール ] から [ ルールを追加 ] を押します。

  2. ルールタイプの選択で [ AWSによって管理されるルールの追加 ] を選択、AWSマネージド型ルールで検索窓に [ required ] と入れた2ページ目(2022/5執筆時点)にある [ required-tag ] を選択し、[ 次へ ] を押します。

  3. トリガーの変更範囲を [ すべての変更 ] 、パラメータのキー [ tag1Key ] の値に [ User ] と入力(他の部分はそのままで可)、ルールタグにUserタグをつけて [ 次へ ] を押します。



  4. 入力内容を確認し、[ ルールを追加 ] を押したら完了です。

タグなしリソースが作成されたときの動き

設定完了後のConfigのダッシュボード画面です。
作成した1つのルールで62もの非準拠リソースがあることがわかります。

この [ 62非準拠リソース ] のリンクを押すとその詳細を確認することができるので便利です。

タグなしリソースが作成されると数分くらいで以下のようなメールが送付されます。
二重引用符を付けないと改行ができないのですが、不格好なのが気になりますね。

参考と終わりに

今回実装してみて想定外だったことが3点あります。
1点目はすでに作成済のリソースに関してはアラートを出せないこと。
これは仕組上仕方ないとはいえ、作成済のものに関してはやはり一つ一つ対応していかなきゃいけないのは面倒だなと思いました。

2点目はConfigでサポートしているリソースが案外少ないということ。
例えばIAM、Lambda、API Gateway、CloudWatch Logsなどよく使うリソースがサポートされていないと結局別で実装しなければいけなくなります。
Supported Resource Types - AWS Config

3点目は通知できるメールの内容が少ないこと。
作成者をメールに含められればタグを付けてと依頼しやすいのですが、結局CloudTrailで確認して依頼という手間がかかってしまいます。

Userタグはつけているけれどもユーザ名を書いてくれないというパターンも出てきているので、リソースの整理が少し落ち着いてきたらバージョンアップとして上記の問題点に対応できるように変更しようと思います。

参考① EventBridgeに入力するイベントパターン

AWS Config を使用して非準拠の AWS リソースに関する通知を受け取る

上記を参考に以下のようにイベントパターンを入れます。
記事だとセキュリティグループの変更を記録するConfigルールが指定されているため、今回使用している「required-tag」というルールで非準拠になった場合というイベントパターンにしています。

{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "messageType": ["ComplianceChangeNotification"],
    "configRuleName": ["required-tags"],
    "newEvaluationResult": {
      "complianceType": ["NON_COMPLIANT"]
    }
  }
}

参考② 入力トランスフォーマーの入力パス

こちらは先ほどの参考サイトに記載のそのままを入力します。
イベントで発生した項目でSNSに連携したいものを記載すればよいのですが、今回メール通知に必要のない情報も入れておきました。

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

参考③ 入力トランスフォーマーのテンプレート

この項目がSNSへ文字列として渡され、メールの内容になります。改行を含む場合は一行ごと二重引用符で囲わないとEventBridgeのルール作成・更新でエラーとなります。

"Userタグのないリソースが作成されました。"

"<ルール違反のリソース情報>"
"リソースタイプ: <resourceType>"
"リソースID  : <resourceId>"
"非準拠判定日時: <time>"

何でもやってみないとわからないなぁと思いながら本日もAWSを少し理解しました。
以上、ここまで読んでいただきありがとうございました~ ^ ^