🐔

AWS EventBridgeを使用し、EC2インスタンの停止を通知

2022/09/19に公開

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

構築済みのEC2インスタンが停止したことを受けて、EventBridgeのイベン駆動でSNSからEメールを送信して通知してみたいと思う。

前半では、AWSコンソールから作成し、後半で同じ構成をAWS CLIを使用して作成してみる。

EventBridgeのターゲットとしてSNSトピックを指定する必要があるので、先にSNSトピックの作成と、サブスクリプションでEメールアドレスを登録していく。

SNS トピックを作成

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 を使用して、同じ構成を作成していく

基本的にinput-jsonファイルを作成し、aws cli からコマンドを実行する際に読み込ませる形でリソースを構築していきたいと思う。
すべての作業は、aws cli のホームディレクトリ(/home/cloudshell-user)配下で行っていく。

SNSトピックを作成

まずは、input-jsonファイルを作成していく。

sns-create-topic.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://sns-create-tipic.json

カレントディレクトリにinput-jsonファイルがある場合は相対バスで記述可能。
また、コマンドの必須オプションとして--nameを指定する必要があるがinput-jsonファイル内に記述があれば省略可能。
詳しくは、コマンドリファレンスを参照してください。
aws cli コマンドリファレンス

SNSサブスクリプションを作成

ホームディレクトリ配下にinput-jsonファイルを作成していく。

sns-subscribe.json
{
    "TopicArn": "<your topic arn>",
    "Protocol": "email",
    "Endpoint": "<your email address>",
    "ReturnSubscriptionArn": true
}

コマンドを実行し、SNSサブスクリプションの作成をしていく

aws sns subscribe --cli-input-json file://sns-subscribe.json

確認通知がエンドポイントで指定したメールアドレス宛に送信されているのでConfirm subscriptionで有効化する。

EventBridge ルールの作成

EventBridge は、ルールとターゲットを別に設定する必要がある。
まずは、ルール用のinput-jsonファイルの作成をしていく。

events-put-rule.json
{
    "Name": "test-event-rule", 
    "EventPattern": "{ \"source\": [\"aws.ec2\"], \"detail-type\": [\"EC2 Instance State-change Notification\"], \"detail\": { \"state\": [\"stopping\"], \"instance-id\": [\"i-0a97dd1749bbd2cfd\"]}}",
    "State": "ENABLED", 
    "EventBusName": "default" 
} 

続いて、aws cliコマンドを実行して、EventBridgeルールを作成していく。

aws events put-rule --cli-input-json file://events-put-rule.json

EventBridge ターゲットの作成

ターゲット用のinput-jsonファイルを作成していく。

events-put-target.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" 
            }
        }
    ]
}

続いて、aws cliでコマンドを実行し、EventBridgeターゲットを反映していく。

aws events put-targets --cli-input-json file://events-put-target.json

EC2インスタンスを起動状態から停止にしたら、問題なくメール通知されました。

シェルスクリプトで、awsコマンドを実行することで、複数リソースを一気に作成することも可能なので、aws cli を使用した構築はおすすめです。
はじめは、AWSコンソール上でリソースを構築し、構築パラメータを取得することでinput-jsonファイルの書き方の参考にできたりもします。
例えば、EventBridge ルールやターゲットなら以下のコマンドで設定パラメータを取得することができます。

aws events list-rules --name-prefix "test" > test-list-rules.json
aws events list-targets-by-rule --rule "test-event-rule" > test-event-rule-targets.json

どなたかのお役に立てましたら幸いです。

--以上です。--

GitHubで編集を提案

Discussion