AWS の特定のリージョン以外でリソースが作成されたら通知する方法を考えてみた
AWS では Config を使用してリソースの作成を検知することが可能です。
AWS Config でリソースが作成されたときにカスタム E メール通知を受け取る | AWS re:Post
今回は東京リージョン以外でリソースが作成されたら通知する方法を考えてみました。
- 東京リージョンでのリソース作成は通知しない
- EventBridge ルールの
anything-but
を使用する
- EventBridge ルールの
- バージニア北部リージョンとオハイオリージョンでのリソース作成を通知する
- EventBridge ルールのマルチリージョン展開には CloudFormation StackSets を使用する
- イベントは東京リージョンに集約する
- EventBridge のクロスリージョン送受信を使用
前提
- リソース作成を検知したいリージョンで AWS Config が有効になっていること
構築フロー
- 東京リージョンでカスタムイベントバスおよび EventBridge ルールを作成
- ダミーの EventBridge ルールを生成
- ダミーの EventBridge ルールから CloudFormation テンプレートを生成
- 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 ナレッジセンターと同じですが、以下の点を変更しました。
-
anything-but
で東京リージョンを除外- 東京リージョンでのリソース作成は検知したくないため
- Amazon EventBridge イベントパターンでのコンテンツのフィルタリング - Amazon EventBridge
-
resourceType
に関する定義を削除- Config で検知できるすべてのリソースタイプを対象にしたいため
ルールのターゲットは 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 を連携して東京リージョン以外でリソースが作成されたら通知する方法を考えてみました。
どなたかの参考になれば幸いです。
参考資料
- AWS Config でリソースが作成されたときにカスタム E メール通知を受け取る | AWS re:Post
- AWS リージョン間での Amazon EventBridge イベントの送受信 - Amazon EventBridge
- [アップデート] Amazon EventBridgeのリージョン間イベント転送が全リージョンで送受信できるようになりました! | DevelopersIO
- Amazon EventBridge イベントパターンでのコンテンツのフィルタリング - Amazon EventBridge
- ResourceIdentifier - AWS Config
- ConfigurationItem - AWS Config
- Amazon EventBridge イベントバスから AWS CloudFormation テンプレートを生成する - Amazon EventBridge
- AWS CloudFormation StackSets の操作 - AWS CloudFormation
- アカウント指定でCloudFormation StackSetsを作成・削除してみた | DevelopersIO
Discussion