📝

AWS の特定のリージョン以外でリソースが作成されたら通知する方法を考えてみた

2023/10/25に公開

AWS では Config を使用してリソースの作成を検知することが可能です。
AWS Config でリソースが作成されたときにカスタム E メール通知を受け取る | AWS re:Post

今回は東京リージョン以外でリソースが作成されたら通知する方法を考えてみました。

  • 東京リージョンでのリソース作成は通知しない
    • EventBridge ルールの anything-but を使用する
  • バージニア北部リージョンとオハイオリージョンでのリソース作成を通知する
    • EventBridge ルールのマルチリージョン展開には CloudFormation StackSets を使用する
  • イベントは東京リージョンに集約する
    • EventBridge のクロスリージョン送受信を使用

前提

  • リソース作成を検知したいリージョンで AWS Config が有効になっていること

構築フロー

  1. 東京リージョンでカスタムイベントバスおよび EventBridge ルールを作成
  2. ダミーの EventBridge ルールを生成
  3. ダミーの EventBridge ルールから CloudFormation テンプレートを生成
  4. CloudFormation StackSets でバージニア北部リージョンおよびオハイオリージョンに EventBridge ルールを作成

1. 東京リージョンでカスタムイベントバスおよび EventBridge ルールを作成

今回は EventBridge のクロスリージョン送受信を使用して東京リージョンにイベントを集約します。
AWS リージョン間での Amazon EventBridge イベントの送受信 - Amazon EventBridge

クロスリージョン送受信を実現するためにはカスタムイベントバスの作成が必要なので、東京リージョンにカスタムイベントバスと、カスタムイベントバスに属するルールを作成します。

カスタムイベントバスの作成

[アップデート] Amazon EventBridgeのリージョン間イベント転送が全リージョンで送受信できるようになりました! | DevelopersIO

上記のブログを参考に作成します。
ただし、リソースベースのポリシーは同じアカウント内からのアクセスのみに変更しました。

 {
    "Version": "2012-10-17",
    "Statement": [
      {
    
        "Sid": "AllowAccountToPutEvents",
        "Effect": "Allow",
        "Principal": {
          "AWS": "012345678901"
        },
        "Action": "events:PutEvents",
        "Resource": "arn:aws:events:ap-northeast-1:012345678901:event-bus/tokyo"
      }
    ]
  }

ルールの作成

作成したカスタムイベントバスに以下のイベントパターンでルールを作成します。

{
  "source": ["aws.config"],
  "detail-type": ["Config Configuration Item Change"],
  "region": [{
    "anything-but": ["ap-northeast-1"]
  }],
  "detail": {
    "messageType": ["ConfigurationItemChangeNotification"],
    "configurationItem": {
      "configurationItemStatus": ["ResourceDiscovered"]
    }
  }
}

基本的な内容は冒頭の AWS ナレッジセンターと同じですが、以下の点を変更しました。

ルールのターゲットは CloudWatch ロググループにしましたが、メールへ通知したい方は上記ブログを参考に事前に SNS トピックを作成し、ターゲットに SNS トピックを指定してください。

resourceType を指定する場合はドキュメントを参考にサポートされているリソースタイプを記載してください。
ResourceIdentifier - AWS Config

configurationItemStatus にはリソースの検出である ResourceDiscovered 以外にもリソース削除時のステータスなども指定可能なので、指定可能なステータスについてはドキュメントをご確認ください。
ConfigurationItem - AWS Config

configurationItemStatus

2. ダミーの EventBridge ルールを生成

Amazon EventBridge イベントバスから AWS CloudFormation テンプレートを生成する - Amazon EventBridge

EventBridge では作成済みのルールから CloudFormation テンプレートを生成することができますので、テンプレート生成のためにダミーのルールを作成します。

イベントパターンは以下の通り、先ほど作成したルールから anything-but を除いたパターンです。

{
  "source": ["aws.config"],
  "detail-type": ["Config Configuration Item Change"],
  "detail": {
    "messageType": ["ConfigurationItemChangeNotification"],
    "configurationItem": {
      "configurationItemStatus": ["ResourceDiscovered"]
    }
  }
}

上記イベントパターンにより、ルールを作成したリージョンと同じリージョンのリソース作成イベントを検知できます。

ターゲットタイプは「別のアカウントまたはリージョンのイベントバス」を選択し、東京リージョンで作成したカスタムイベントバスの ARN を指定します。
また、実行ロールについても「この特定のリソースについて新しいロールを作成」を選択し、クロスリージョン送受信に必要な IAM ロールも自動作成します。

IAM ロールは全リージョン共通で使用できる内容なのでリージョンに依存せず後述する CloudFormation テンプレートでそのまま使用できます。

3. ダミーの EventBridge ルールから CloudFormation テンプレートを生成

ルール作成後、CloudFormation テンプレートのプルダウンから JSON または YAML 形式でテンプレートをダウンロードできます。

今回は YAML 形式でダウンロードしました。

AWSTemplateFormatVersion: '2010-09-09'
Description: >-
  CloudFormation template for EventBridge rule
  'ConfigurationItemChangeNotification-Rule'
Resources:
  EventRule0:
    Type: AWS::Events::Rule
    Properties:
      EventBusName: default
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Configuration Item Change
        detail:
          messageType:
            - ConfigurationItemChangeNotification
          configurationItem:
            configurationItemStatus:
              - ResourceDiscovered
      Name: ConfigurationItemChangeNotification-Rule
      State: ENABLED
      Targets:
        - Id: Idb60e0d61-4b48-4e75-9996-xxxe67bb38b1
          Arn: arn:aws:events:ap-northeast-1:0123456789012:event-bus/tokyo
          RoleArn: >-
            arn:aws:iam::0123456789012:role/service-role/Amazon_EventBridge_Invoke_Event_Bus_1079235493

CloudFormation テンプレートをダウンロードできたらダミーのルールは削除します。

CloudFormation StackSets でバージニア北部リージョンおよびオハイオリージョンに EventBridge ルールを作成

AWS CloudFormation StackSets の操作 - AWS CloudFormation

CloudFormation StackSets はマルチアカウントおよびマルチリージョンに CloudFormation テンプレートを一斉にデプロイできる機能です。
今回は同じアカウント内でマルチリージョンに展開します。

なお、今回のデプロイでは AWS Organizations の組織を対象にデプロイしますが、AWS Organizations を使用しなくても StackSets は利用可能です。
AWS Organizations を使用しないパターンについては以下のブログをご覧ください。
アカウント指定でCloudFormation StackSetsを作成・削除してみた | DevelopersIO

今回は AWS Organizations の管理アカウントから子アカウントのバージニア北部リージョンとオハイオリージョンにデプロイします。
テンプレートは先ほどダウンロードしたテンプレートを使用します。

スタック名は任意とし、デプロイ先の OU、リージョンを指定します。


その他の設定はデフォルトのままデプロイします。
デプロイが完了すると子アカウントのバージニア北部リージョンとオハイオリージョンに CloudFormation スタックと EventBridge ルールが作成されます。

これでバージニア北部リージョンとオハイオリージョンでリソースが作成されたら東京リージョンへ通知する構成は構築完了です。

動作確認

東京リージョン、バージニア北部リージョン、オハイオリージョンで S3 バケットを作成して動作確認します。
期待される動作は以下の通りです。

  • 東京リージョン: CloudWatch Logs にログが出力されない
  • バージニア北部リージョン: CloudWatch Logs にログが出力される
  • オハイオリージョン: CloudWatch Logs にログが出力される

各リージョンで S3 バケットを作成します。

東京

バージニア北部

オハイオ

ログを確認したところ、期待通りの結果でした。

なお、S3 バケットの作成イベントの前にも CloudFormation スタックの作成イベントや EventBridge ルールの作成イベントも記録されていましたが、S3 バケット同様に東京リージョンのイベントは記録されていませんでした。

まとめ

今回は AWS Config と EventBridge を連携して東京リージョン以外でリソースが作成されたら通知する方法を考えてみました。
どなたかの参考になれば幸いです。

参考資料

Discussion