AWSの部屋

AWS学習者向けのブログです

EventBridge を使用して EC2 インスタンスの停止を検知し再起動させる

はじめに

システム運用時に何かしらのイベントをきっかけに特定の処理を実行したり、スケジュールされた処理を実行したいことがあると思いますが、そういった際には EventBridge を使うと便利です。

Amazon EventBridge とは

AWSサービス、カスタムアプリケーション、 SaaSアプリケーションのための サーバレスイベントバスサービスで、多数のAWS サービスとSaaS アプリケーションを接続します。

イベントバスとは

イベントを受信するパイプライン

アーキテクチャ

ユーザが誤って EC2 インスタンスを停止したと仮定して、そのインスタンスを再起動させる処理を実行します。

イベント種類 内容
EventBridgeに直接送信されるイベント AWSリソースの状態変化を起点にイベントが発生する
CloudTrail経由で送信されるイベント ユーザーのAWSリソースに対する操作(=API呼び出し)を 起点にイベントが発生する
EventBridgeで未サポートのサービス

AWSのリソースの操作ログ を取得する AWS CloudTrail 経由でイベントを取得することが可能です。

手順

  1. EC2インスタンスの起動
  2. IAMロールの作成
  3. Lambda 関数の作成
  4. EventBridge ルールの作成
  5. 動作確認

1. EC2インスタンスの起動

EC2 インスタンスを起動させます。

2. IAMロールの作成

「AmazonEC2FullAccess」ポリシーを付与した「Lambda-Execute-Instance」ロールを作成します。これで Lambda から EC2 へのアクセスができるようになります。

3. Lambda 関数の作成

以下のように Lambda 関数を作成します。

[関数名]:MyFunctionEC2
[ランタイム]:Python 3.9
[既存のロール]:Lambda-Execute-Instance

EC2 インスタンスを開始する処理を実装します。

iimport boto3
import os

# インスタンスID
instances = [os.environ['INSTANCE_ID']]

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name='ap-northeast-1')
    
    # インスタンスの状態変化を取得
    action = event["Action"]
    
    # インスタンスの状態を取得
    response = ec2.describe_instances(InstanceIds=instances)
    ec2_status = response['Reservations'][0]['Instances'][0]['State']['Name']

    # インスタンスが停止されたかを判定
    if action == "Stop":
        ec2.start_instances(InstanceIds=instances)
        print('インスタンスを開始: ' + str(instances[0]))
    else:
        print('インスタンスに対する処理を実行しない')

デプロイが完了したら環境変数を設定します。

キー
INSTANCE_ID EC2 インスタンスの ID

4. EventBridge ルールの作成

少し長いですが、以下のように EventBridge ルールを作成します。

以下の JSON を Lambda に送信します。

Lambda のトリガーとして EventBridge が登録されました。

5. 動作確認

インスタンスの停止

インスタンスを停止します。

インスタンスの開始

インスタンスの停止後に自動的にインスタンスが開始されました。

さいごに

EventBridge を使うことによって簡単に EC2 インスタンスの状態変化を検知することができることがわかりました。AWS認定試験に必ず出題される EventBridge ですが、他にも様々なことができるので今度は他の機能も使ってみようと思います。