#はじめに
業務上に、異なるAWSアカウント間でのアラーム統一管理ニーズがありました。
調べたところ、CloudWatchのEvent Bus機能が使えそうなので、それを使ってクロスアカウント間でCloudWatchイベント転送を実現してみました。
#構成図
今回の構成図は下記となります。
今回はアカウントAのEC2が停止したら、CloudWatchのEvent Bus機能を経由し、アカウントBのSNSでメールを送信させるという仕組みになります。
なお、今回はアカウントAでEC2をCloudWatchのターゲットにしていましたが、それとほかに、Lambda、API Gatewayのサービスも使えます。いろいろと用途が幅広く、AWSクロスアカウント間でCloudWatchを経由して何かの機能を実現したときに、ぜひご参考ください。
#1.アカウントBで、アカウントAとのイベントバス追加
アカウントBのAWSマネジメントコンソール画面に、「CloudWatch」を入力し、クリックします。
左側メニューに「イベントバス」をクリックし、次に「アクセス許可の追加」をクリックします。
アカウントID欄に、アカウントAのIDを入力し、「追加」をクリックします。
#2.アカウントBでSNSトピックを作成
アカウントBのAWSコンソール画面からSNSを検索し、下記のようにSNS機能画面にアクセスします。
左側メニューから「トピック」をクリックし、「トピックの作成」をクリックします。
名前欄に命名規則に従って名称を入力し、ほかの設定はそのままデフォルトにして作成します。今回はテストのため、テスト名を入れました。
上記作成したトピックに入り、「サブスクリプションの作成」をクリックします。
トピックARNを上記作成したトピックのARNを選びます。
プロトコル欄に「Eメール」をクリックします。
エンドポイントに受信したいメールアドレスを入力します。
上記ご入力したメールに、AWSからのメッセージが届きます。
「Confirm subscription」をクリックします。
下記のように「Subscription confirmed!」というメッセージが表示されれば成功です。
#3.アカウントAでCloudWatchのルール作成
アカウントAでCloudWatch画面に入り、左側メニュー「ルール」をクリックし、「ルールの作成」をクリックします。
「イベントパターン」をクリックします。
サービス名に「EC2」を選択します。
イベントタイプに「EC2 Instance State-change Notification」を選択します。
→「特定の状態」をクリックし、「Stopped」を選択します。
→「特定のインスタンスID」をクリックし、通知したいインスタンスのIDを入力します。
ターゲットに「別のAWSアカウントのイベントバス」を選択し、アカウントBのIDを入力します。
下記「この特定のリソースに対して新しいロールを作成する」をクリックします。
次に「設定の詳細」をクリックし、名称を入れます。(※ここで省きます)
下記のように、ルールの作成が完了しました。
#4.アカウントBでCloudWatchのルール作成
アカウントBでCloudWatch画面に入り、左側メニュー「ルール」をクリックし、「ルールの作成」をクリックします。
イベントパターンをクリックし、下記のJSONコードを入力します。
{
"source": [
"aws.ec2"
],
"account": [
"アカウントAのID"
],
"detail-type": [
"EC2 Instance State-change Notification"
],
"detail": {
"state": [
"stopped"
]
}
}
ターゲット欄に「SNSトピック」を選択します。
トピックは上記手順2で作成したトピックをお選びください。
[Input Path] に以下を入力します。
{"instance-id":"$.detail.instance-id", "state":"$.detail.state", "time":"$.time", "region":"$.region", "account":"$.account"}
[Input Template] に以下を入力します。
"At <time>, the status of your EC2 instance <instance-id> on account <account> in the AWS Region <region> has changed to <state>."
※カスタマイズした内容を入力することもできます。
「詳細の設定」をクリックします。
名前欄に命名規則に従って名称を入れます。
「ルールの作成」をクリックします。
#5.テスト
上記3で指定したインスタンスを停止してみます。
該当インスタンスを右クリックし、「インスタンスの状態」→「停止」をクリックします。
下記のように、インスタンス停止のお知らせがメールに届いております。
これでクロスアカウント間CloudWatchによるEC2ステータス変化メール通知機能が実現できました。
#最後
CloudWatchのEvent Bus機能はいろいろとクロスアカウント間で幅広く使えるので、今回はEC2停止だけを試しました。AWSクロスアカウント間でCloudWatchを経由して何かの機能を実現したときに、ぜひご参考ください。
#参考資料
1.https://dev.classmethod.jp/articles/cloudwatch-events-event-bus/
2.https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/CloudWatchEvents-CrossAccountEventDelivery.html
3.https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CloudWatchEvents-CrossAccountEventDelivery.html