Amazon EventBridgeを使ってEC2の状態変更（Stop）を検知しLambdaで自動起動を実行する。

## はじめに

[アイレット株式会社 22新卒 Advent Calendar 2022](URL "https://qiita.com/advent-calendar/2022/iret-22")に投稿される22日目の記事になります。

https://qiita.com/advent-calendar/2022/iret-22

本記事は、Amazon EventBridge、Lambdaを使用しEC2の状態変更（Stop）を検知しLambdaで自動起動を実行するまでのハンズオンをまとめたものになります。
上記サービスに加え、IAMの概要を**簡単**に説明していきながら進めていきます。
また、AWS SOA試験ラボの対策にもなると思いますので、最後まで読んでいただけたら幸いです。

## 1. EC2インスタンスの起動
![スクリーンショット_2022-12-13_22_15_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/21008ab9-9d36-d001-806a-d1393cc0b67c.png)

## 2. Lambda関数を実行するためのIAM role, policy作成
IAM roleとはLambda等の様々なAWSサービスに対して付与するものと考えてください。付与することで、対象のAWSサービスがその権限を持って様々な処理を実行することができます。その際に、どのような処理を実行するのかということをIAM policyに記述し、IAM roleにアタッチすることで対象のAWSサービスがIAM policyに基づいた処理を実行することができるようになります。
今回は、LambdaにIAM roleを付与し、EC2インスタンスを起動するというIAM policyをIAM roleに付与します。
まずは、IAM policyを作成します。
![スクリーンショット 2022-12-13 22.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/1c7b9d5c-4992-6871-bd6b-a5612fc2d790.png)
次にIAM roleを作成し、作成したIAM policyをアタッチします。
これで、lambdaがec2インスタンスに対してStartアクションを実行する権限を作成できたので、Lambda関数にこのIAM roleをアタッチしていきます。
![スクリーンショット_2022-12-13_22_12_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/ca50b22c-b3b4-fa50-1245-56a15a56af0a.png)

## 3. Lambda関数の作成
lambdaとはサーバーを準備することなくコードを実行できるサーバレスなサービスです。また、lambda APIを使用してlambda関数を呼び出したり、今回のように他のAWSサービスのイベントに応じたlambda関数を実行したりできます。
![スクリーンショット 2022-12-13 22.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/50e8c74a-0ef7-c001-f2ce-0ac555c823ae.png)
インスタンスIDとRegionは適宜変更してください。
```lambda_function.py
import boto3
region = 'ap-northeast-1'
instances = ['i-0be705780a4e875d1']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.start_instances(InstanceIds=instances)
    print('started your instances: ' + str(instances))

```

## 4. EventBridgeの作成
イベントバスはデフォルトのままで大丈夫です。デフォルトイベントバスとは、現在使用しているAWSアカウント内のAWSサービスによって発生したイベント通知の受け皿的な役割を果たしています。なお、独自のアプリケーションからのイベントを監視したい場合は、カスタムイベントバスを作成する必要があります。
今回はデフォルトイベントバスを使用して、ルールを作成します。
ルールの機能はイベントパターンとターゲットの二つに分類されます。
イベントパターン：どのAWSイベントを監視するのかを指定する機能
ターゲット：検知したイベントに対して後続の処理を決定する機能
![スクリーンショット 2022-12-13 22.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/1beffdeb-b189-8536-bfe1-add8073ed0ff.png)
![スクリーンショット 2022-12-13 22.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/b58405bd-75d1-92cd-8c0e-e7a3b469d745.png)
![スクリーンショット 2022-12-13 22.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/19740fe5-9aa7-503c-581e-95f0120beb79.png)
![スクリーンショット 2022-12-13 22.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/9e3f95cb-8d39-43ee-f2b4-d93f84580cc2.png)

以上でEC2の停止をEventBridgeで検知し、lambdaで自動起動を実行する準備が整ったので、想定通りの動作になるかEC2インスタンスを停止させて確認したいと思います。

## EC2インスタンスの停止
 EventBridgeを実行させるためにEC2インスタンスを停止します。
![スクリーンショット 2022-12-13 22.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/c621ca27-7021-9334-1cb9-34653b44a712.png)

## 停止後に実施された自動起動の確認
こちらでEC2インスタンスの自動起動を確認していましたが、スクリーンショットでは伝わらないと思うので、下記でLambdaの実行ログのスクリーンショットを記載します。
![スクリーンショット 2022-12-13 22.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/271b1e91-2ff0-2f1e-b35d-b833fcc1e868.png)

## Lambdaの実行ログの確認
![スクリーンショット 2022-12-13 22.39.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953955/7ae5a6a0-bb57-d9c7-2b5a-90c031178cb3.png)

## 終わりに
以上のように、 EventBridgeを使用してEC2の状態変更を検知し準備していたlambdaによって自動起動を実行することができました。
  EventBridgeは豊富な機能を持っており、システムの開発・構築・運用の全ての段階で活躍できる素晴らしいサービスだと実感しました。

アドカレを企画し、Qiitaに記事を投稿する機会を作ってくれた[@Michinosuke](URL "https://qiita.com/Michinosuke")には感謝です:smiley:
[アイレット株式会社 22新卒 Advent Calendar 2022](URL "https://qiita.com/advent-calendar/2022/iret-22")企画の23日目は[@haru-nk](URL "https://qiita.com/haru-nk")が担当です！
よろしくお願いします:smile:

参考
https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-bus-perms.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/start-stop-lambda-eventbridge/
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html