EC2インスタンスの変化時(開始・停止)にメール通知やSMS通知を行う方法をご紹介します。
- Amazon EventBridge
- Amazon Simple Notification Service
を利用します。次のような構成です。

手順
最初にAmazon SNSを利用して「トピック」と「サブスクリプション」を作成します。次に、EventBridgeでEC2インスタンスの状態変化をトリガにして、作成したトピックを選択すれば完成です。

私は次のように理解しています。
◆トピック
・サブスクリプション(メール通知やSMS通知など)をまとめたものであり、EventBridge等のSNS先には「トピック」を選択します。
◆サブスクリプション
・通知先のようなものです(メール通知やSMS通知先など)。
・初回は承認しないと使えません(確認メッセージをクリックなど)。

Amazon SNS:トピックとサブスクリプションを作成
SNSサービスの「トピック」より「トピックの作成」をクリックします。

「トピックの作成」画面となるため、タイプ「スタンダード」を選択して、任意名前を入力して作成します。今回、他はデフォルトのまま進めます。

基本はデフォルトでOKです。EventBridge側で作成したトピックを選択した時に、自動的にトピックの権限変更が行われます。
続いて、このトピックに括り付ける通知先エンドポイント「サブスクリプション」を作成していきます。

最初にEメールのサブスクリプションを作成します。

作成完了するとステータスは「保留中の確認」となります。
確認メールが入力したメール先に届いているため、確認を行うと、ステータスは「確認済み」となります。



続いて、同様に「SMS」用のサブスクリプションを作成します。(画面には載せてませんが、確認を行わないと、ステータスが確認済みになりません。SMSの場合は確認番号入力です。)

以上でSNS側の準備は完了です。
Amazon EventBridge:イベントを作成
EventBridgeサービスの「ルール」より「ルールの作成」をクリックします。

ルール名を入力します。

続いて「パターンを定義」では、任意EC2の状態変化時(今回はrunning, stopped)にイベントが発火するように設定します。
- イベントパターン
- イベント一致パターン:サービスごとの事前定義パターン
- サービスプロバイダー:AWS
- サービス名:EC2
- イベントタイプ:EC2 instance State-change Notification
- 特定の状態:running, stopped
- 個別のインスタンスID:対象のインスタンスID

ターゲットを選択では、「SNSトピック」として、先ほどSNSで作成したトピックを選択します。


設定は以上となります。お疲れ様でした。
EventBridgeの設定を終えると、該当トピックのアクセスポリシーに以下のようなJSONが追記されます。
{
"Sid": "AWSEvents_ec2-state_Id8169a9a3-1111-44c6-8845-76a9sd7f987d",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:ap-northeast-1:1111111111111:test"
}
該当EC2を開始すると次のような通知が届きます(SMSの場合も同等です)。

(参考) 文面を調整
デフォルトだと、状態変化時のJSON内容がそのまま届くため、通知文面を以下公式の手順に沿って調整します。
ここでは「The EC2 instance i-xxxxxx has changed state to running.」のような、文面にカスタマイズしていきます。該当イベント@ターゲットの「入力の設定」において、入力トランスフォーマーを選択します。
◆入力パス(特定JSONデータを変数として定義)
{"state" : "$.detail.state", "instance" : "$.detail.instance-id"}
◆入力テンプレート(変数をテンプレートに当てはめる)
→ ここでの変数は<>で囲われた、instance, stateです。
"The EC2 instance <instance> has changed state to <state>."

以下警告が出て変更が出来ません(2021年1月時点)
Invalid InputTemplate for target Id98991594-9b32-42e5-a5f9-2345678966 : [Source: (String)”The EC2 instance null has changed state to null”; line: 1, column: 4].
→ 入力テンプレート(下の入力フォーム)の内容をダブルコーテーション””で囲ったら、警告が出なくなりました。不具合でしょうか、すぐに直りそうな気はします。
EC2の停止操作を行ったところ、以下の文面で通知が届きました。
先ほどのJSONベタとは異なり、シンプルになりました。

これ以上のカスタマイズ(インスタンスIDではなく、Nameタグを使う等)は、現時点ではLamdbaでガリガリと書くしかなさそうです。今後のバージョンアップに期待します。
(ご参考) コスト
■EventBridge

AWS のサービスによって発行されたすべての状態変更イベントは無料です。
■SNS

エンドポイントの種類 | 無料利用枠 | 料金 |
---|---|---|
モバイルプッシュ通知 | 100 万件の通知 | 0.50USD/100 万通知 |
Email/Email-JSON | 1,000 件の通知 | 2.00USD/10 万通知 |
ヘビーに使わない限り、通知に関するコストはあまり気にしなくてよさそうです。
まとめ
EC2インスタンスの状態変化時にメールやSMS通知を行う方法をご紹介しました。AWSのサービスを使うことで、簡単に通知処理を構築することが出来ます。本記事は基本的な内容になるため、しっかり抑えれば様々なケースにも適用できると思います。

最後までご覧いただき、ありがとうございました。
コメント