AWS EventBridge と Amazon SNSを使用して、EC2インスタンスの停止をEメール通知してみました。

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

–以上–

コメントは利用できません。

求人採用のエントリーはこちら

求人採用/エントリー>