EC2インスタンスの状態変化時にメールやSMS通知を行う

AWS
この記事は約6分で読めます。
記事内に広告が含まれています。

EC2インスタンスの変化時(開始・停止)にメール通知やSMS通知を行う方法をご紹介します。

  • Amazon EventBridge
  • Amazon Simple Notification Service

を利用します。次のような構成です。

手順

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

私は次のように理解しています。

SNSのトピックとサブスクリプション

◆トピック
・サブスクリプション(メール通知やSMS通知など)をまとめたものであり、EventBridge等のSNS先には「トピック」を選択します。

◆サブスクリプション
・通知先のようなものです(メール通知やSMS通知先など)。
・初回は承認しないと使えません(確認メッセージをクリックなど)。

トピックとサブスクリプション


Amazon SNS:トピックとサブスクリプションを作成

SNSサービスの「トピック」より「トピックの作成」をクリックします。

トピックを作成していきます。

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

トピックの作成。
トピックの権限について

基本はデフォルトでOKです。EventBridge側で作成したトピックを選択した時に、自動的にトピックの権限変更が行われます。


続いて、このトピックに括り付ける通知先エンドポイント「サブスクリプション」を作成していきます。

サブスクリプションを作成します。

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

プロトコル「Eメール」、エンドポイント「任意Eメールアドレス」を入力ます。

作成完了するとステータスは「保留中の確認」となります。

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

ステータス「保留中の確認」です。
確認メール上のURLにアクセスします。
ステータス「確認済み」になりました。

続いて、同様に「SMS」用のサブスクリプションを作成します。(画面には載せてませんが、確認を行わないと、ステータスが確認済みになりません。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内容がそのまま届くため、通知文面を以下公式の手順に沿って調整します。

Tutorial: Use input transformer to customize what EventBridge passes to the event target - Amazon EventBridge
Learn how to use the input transformer feature of Amazon EventBridge.

ここでは「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

料金 - Amazon EventBridge | AWS
Amazon EventBridge では、イベントバスにパブリッシュされたイベントや、スキーマを検出するために取り込まれたイベントに対してのみ支払いが発生し、最低料金や前払いの義務はありません。

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


■SNS

料金 - Amazon SNS | AWS
Amazon SNS 向けに細分化された料金表です。使用分の料金のみをお支払いください。最低料金設定はありません。AWS 簡易見積りツールを使って月額料金をお見積りください。
エンドポイントの種類無料利用枠料金
モバイルプッシュ通知100 万件の通知0.50USD/100 万通知
Email/Email-JSON1,000 件の通知2.00USD/10 万通知

ヘビーに使わない限り、通知に関するコストはあまり気にしなくてよさそうです。

まとめ

EC2インスタンスの状態変化時にメールやSMS通知を行う方法をご紹介しました。AWSのサービスを使うことで、簡単に通知処理を構築することが出来ます。本記事は基本的な内容になるため、しっかり抑えれば様々なケースにも適用できると思います。

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

コメント

Top
タイトルとURLをコピーしました