WillPrideの大坪です。
構築済みのEC2インスタンスが停止したことを受けて、EventBridgeのイベントをSNSに連携し、Eメールを送信して通知してみたいと思います。
前半のパートでは、AWSコンソールより環境構築を行い。後半のパートで同じ構成のものをAWS CLIを使用して構築していきたいと思います。
SNSトピックの作成
まずは、EventBridgeのターゲットとしてSNSトピックを指定する必要があるので、SNSトピックを作成し、続けてサブスクリプションとしてEメールアドレスを登録していきます。
AWS コンソールにログインしたら、SNSサービスに移動し SNSを作成
を選択します。
次に名前
と表示名
を入力していきます。
表示名
を入力することで、Eメール通知の件名となります。
今回は、その他の項目の設定は変更せずにトピックを作成
を選択します。
サブスクリプションの作成
SNSトピックが作成されたら、次にサブスクリプションを作成していきます。
作成したSNSトピックを選択したらサブスクリプションの作成
を選択します。
トピックARNは自動入力されていると思いますので、プロトコルにEメール
を選択し、エンドポイントに使用するEメールアドレスを入力したらサブスクリプションの作成
を選択します。
サブスクリプションが登録されたら、ステータスが保留中
の確認となっているので、次に登録したEメールアドレス宛に確認メールがAWSから送信されているので確認する。
メール本文のConfirm subscription
を選択し、Webページに飛んで、Subscription confirmed!
と表示されれば登録は完了。
SNSサブスクリプションを確認すると、ステータスが確認済み
となっていることを確認できる。
EventBridgeルールの作成
次にEventBridgeサービスに移動しルールを作成
を選択。
名前
を入力したら次へ。
指定のEC2インスタンスのステータスが停止となったことを受けて通知を行うようにイベントパターン
を作成していく。
続いて、ターゲットにSNSトピックを選択し、トピックに先程作成したものをプルダウンから選択。
AWSで標準出力されるものは英語で書かれているため、イベントの出力内容を編集していく。
追加の設定のターゲット入力を設定で入力トランスフォーマー
を選択し、入力トランスフォーマーの内容を編集していく。
まず、入力パス
にAWSで標準出力されるJSONの内容から、JSONのキー・バリュー形式で必要な情報を書き出していく。
続いて、テンプレートに実際に出力したい文字列を入力していく。
このときに入力パスで指定したキーを <key-name>
形式で使用することが可能。
他のステータスについては変更せずにルールの作成
を行う。
ルールが作成されステータスがEnabled
となっていれば、EC2インスタンスを停止させ、Eメール通知されるか確認する。
実際にインスタンスを停止するとメールが送信され、メールの本文に入力トランスフォーマーの内容が反映されていることを確認することができる。
AWS CLI を用いて、同じ構成を作成してみる
AWS CLI でinput-json
オプションを使用するので、JSONファイルを作成し、AWS CLI からコマンドを実行する際にファイルを読み込ませる形でリソース構築を行う。
すべての作業は、AWS CloudShell のホームディレクトリ/home/cloudshell-user
で行う。
SNSトピックを作成
まずはinput-json
用のJSONファイルを作成する。
{
"Name": "test-cli-topic",
"Attributes": {
"DisplayName": "EC2インスタンスが停止しました。"
}
}
input-json の書き方がわからないときは
aws sns create-tipic --generate-cli-skeleton > create-topic-template.json
コマンドのオプションに--generate-cli-skeleton
を指定してコマンドを実行することでinput-json
用のテンプレートを見ることができる。
上記のコマンドはファイル書き出しまで行っている。
続いてAWS CLIでSNSトピックの作成をしていく。
aws sns create-topic --cli-input-json file://<input-json-filename>.json
CloudShellのカレントディレクトリにinput-json
用のファイルを配置しておく。
また、SNSトピック作成の必須オプションとして--name
を指定する必要があるがinput-json
用のファイル内に記述があればオプションでの指定は省略することが可能。
詳しくは、AWS CLIのコマンドリファレンスを参照
SNSサブスクリプションを作成
CloudShellのホームディレクトリにSNSサブスクリプション用のinput-json
用ファイルを作成していく
<your topic arn>
および <your email address>
は書き換えが必要。
{
"TopicArn": "<your topic arn>",
"Protocol": "email",
"Endpoint": "<your email address>",
"ReturnSubscriptionArn": true
}
コマンドを実行し、SNSサブスクリプションを作成していく。
aws sns subscribe --cli-input-json file://<input-json-filename>.json
EventBridgeルールの作成
EventBridgeは、ルールとターゲットで別のコマンドとなっている。
まず、ルール用のinput-json
ファイルを作成する。
<instance-id>
は書き換えが必要。
{
"Name": "test-event-rule",
"EventPattern": "{ \"source\": [\"aws.ec2\"], \"detail-type\": [\"EC2 Instance State-change Notification\"], \"detail\": { \"state\": [\"stopping\"], \"instance-id\": [\"<instance-id>\"]}}",
"State": "ENABLED",
"EventBusName": "default"
}
コマンドを実行し、EventBridgeルールを作成する。
aws events put-rule --cli-input-json file://<input-json-filename.json
EventBridgeターゲットの作成
EventBridgeターゲット用のinput-json
ファイルを作成する。
{
"Rule": "test-event-rule",
"EventBusName": "default",
"Targets": [
{
"Id": "1",
"Arn": "<sns topic arn>",
"InputTransformer": {
"InputPathsMap": {
"detail-type": "$.detail-type",
"instance-id": "$.detail.instance-id",
"state": "$.detail.state",
"time": "$.time"
},
"InputTemplate": "\"インスタンスID「<instance-id」のステータスが「<state>」に変更されました。\"\n\n\"発生時刻は「<time>」です。\"\n"
}
}
]
}
コマンドを実行し、先程作成したEventBridgeルールにターゲットを追加していく
aws events put-targets --cli-input-json file://<input-json-filename.json
EC2インスタンスを起動状態から停止することで、問題なくEメール通知されることが確認できた。
同じような設定を複数作成する場合は、AWS CLI での構築をおすすめする。
まずは、AWSコンソールでリソースを構築し、構築パラメータを取得することでinput-json
用のファイルの書き方の参考にすることもできる。
EventBridgeルールやダーゲットなら以下のコマンドで設定パラメータを取得することが可能。
aws events list-rules --name-prefix "<eventbridge-rule-name" > test-list-rules.json
aws events list-targets-by-rule --rule "<eventbridge-rule-name>" > test-event-rule-targets.json