はじめに
システム運用時に何かしらのイベントをきっかけに特定の処理を実行したり、スケジュールされた処理を実行したいことがあると思いますが、そういった際には EventBridge を使うと便利です。
Amazon EventBridge とは
AWSサービス、カスタムアプリケーション、 SaaSアプリケーションのための サーバレスイベントバスサービスで、多数のAWS サービスとSaaS アプリケーションを接続します。
イベントバスとは
イベントを受信するパイプライン
アーキテクチャ
ユーザが誤って EC2 インスタンスを停止したと仮定して、そのインスタンスを再起動させる処理を実行します。
イベント種類 | 内容 |
---|---|
EventBridgeに直接送信されるイベント | AWSリソースの状態変化を起点にイベントが発生する |
CloudTrail経由で送信されるイベント | ユーザーのAWSリソースに対する操作(=API呼び出し)を 起点にイベントが発生する |
EventBridgeで未サポートのサービス
AWSのリソースの操作ログ を取得する AWS CloudTrail 経由でイベントを取得することが可能です。
手順
- EC2インスタンスの起動
- IAMロールの作成
- Lambda 関数の作成
- EventBridge ルールの作成
- 動作確認
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 ですが、他にも様々なことができるので今度は他の機能も使ってみようと思います。