【コスト削減】AWS EC2インスタンス 夜間休日自動停止方法 (3) Amazon EventBridge Scheduler

# 1. はじめに
- AWS環境のコスト削減に取り組んでいる。コスト削減の一番ベーシックな対策である、EC2インスタンスの夜間休日の自動停止方法について、いくつかやり方があるようなので、それぞれ試してみて、難易度やメリット・デメリットを比較する。
- 本記事では2023/5時点で最新の方法と思われる、EventBridge Schedulerでの方法を確認する。

# 2. やったこと
- 自動起動・停止対象とするインスタンスを1台用意する。
- 以下のスケジュール設定により、夜間休日のインスタンス自動停止を実現する。 
    - EventBridge Schedulerで、月～金の9:00に、インスタンスを起動する設定とする。
    - EventBridge Schedulerで、月～金の21:00に、インスタンスを停止する設定とする。

# 3. Amazon EventBridge Schedulerとは（自分の理解）
- 2022/11頃リリースされた様子。([AWS公式: Amazon EventBridge で新しいスケジューラーの提供を開始](https://aws.amazon.com/jp/about-aws/whats-new/2022/11/amazon-eventbridge-launches-new-scheduler/))
- 元々「EventBridge ルール」の設定において、「何らかの外部処理をスケジューリング設定して呼び出す仕組み」があった。
- その仕組みは残りつつ、「EventBridge Scheduler」では、スケジューリング機能が強化され、EventBridgeの子サービスの一つとして昇格している感じ。
- 「EventBridge Scheduler」では、まずスケジュールを設定し、次にやりたい処理を設定する。「やりたい処理」として、外部のLambdaやSSM Automation ドキュメントなどを呼び出す必要はなく、既定のAPI（出来合いの処理のセット）としてインスタンスの起動や停止が用意されている。

# 4. 構成図

![ins34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5a83b988-b69b-ab24-c188-24f122c2cdc1.png)

- EventBridge Schdulerは、専用のアイコン（カレンダーと時計みたいな絵のもの）も用意されている。

# 5. 手順

## 5.1 事前準備
- 自動起動・停止の対象とするEC2インスタンスを作成する。このインスタンスのインスタンスIDを指定して自動起動・停止の操作を行う。

## 5.2 IAMロールの作成
- EventBridge スケジューラに対し、EC2の操作（今回は停止・起動）を許可する権限を付与する必要があり、そのためのIAMロールを作成する。
- IAM -> ロール -> ロールを作成 ->「信頼されたエンティティタイプを選択」にて、「カスタム信頼ポリシー」を選択し、以下のJSONを指定する。

![ins31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/597d3fae-47ea-d91f-596d-c2333be8443f.png)

``` scheduler.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

:::note info
このロールの作成時、最初から信頼されたエンティティを「EventBridge Scheduler」にしたいが、2023/5現在、その指定ができないので、今回は「カスタム信頼ポリシー」の画面から作成する。
:::

- 許可ポリシーとして、「AmazonEC2FullAccess」を選択する。（今回は検証のため適当だが、実際には必要な最小権限を付与）

![ins32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/d2828ee2-c9a9-fdcf-4a37-9150a77eb648.png)


- ロール名(mksamba-EventScheduler-InstanceStartStopRole)を付けて、ロールを作成する。

![ins33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a3f8c1cd-bbc5-46c0-d0be-7ae24c6c24c4.png)


## 5.3 EventBridge Schedulerでのスケジュール登録


- インスタンス停止を行うスケジュールを作成する。
- EventBridge スケジューラ > スケジュール > スケジュールを作成 を選択し、スケジュール名を「mksamba-schedule-instance-stop」とする。
- 月～金の21:00PMに動作するよう、cron式を設定する。今回は「0 21 ? * MON-FRI *」で設定。動作スケジュールの設定は直接JSTで可能。

![ins35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4b56c2ce-5d9e-74e9-a62d-f781fc0ea00f.png)
![ins36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/186353c7-c8ff-8e3c-bb30-a0a3e7ed4d4c.png)

- ターゲット(時間になったら実行するのは何か)として、「EC2」->「StopInstances」を選択し、パラメータとして対象のInstanceIdを入力する。

![ins37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/fdd400c0-da2d-77c2-75d6-8c7b6a2f8918.png)

- このスケジューラを実行するIAMロールを設定する。（先の手順で作成したロールを使用）


![ins38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ee7d1ab4-db94-c2bb-861b-4a4dc0181e32.png)
![ins39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/04964419-a594-8f67-27fd-a4cd00d4296e.png)

- 同様に、インスタンス開始を行うスケジュール「schedule-instance-stop」を作成する（画面は省略）。開始は月～金の9:00AMとするため、CRON式は「0 9 ? * MON-FRI *」となる。また、実行するターゲットは「EC2」->「StartEC2Instance」となる。

## 4.4 停止・起動の動作確認

- 検証用に、16:16に起動、16:20に停止するようにEventBridge Schedulerの時刻設定を変更する。

- Cloudtrailのログは以下のようになる。イベントの詳細を開くと、EventBridge Schedulerから起動・停止されていることを確認可能。

![ins40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/32ee57dd-c166-fc80-4c5f-04d672aab636.png)

``` イベントレコード(抜粋).json
{
    "eventVersion": "1.08",
    "eventTime": "2023-06-05T07:16:45Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "us-west-1",
    "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.20.67 Linux/5.10.179-166.674.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/11.0.19+8-LTS Java/11.0.19 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
}
```



# 5. 参考

- [What is Amazon EventBridge Scheduler?](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)
    - AWS公式の「EventBridge Scheduler」に関するドキュメント。
    
- [Amazon EC2 の定期停止が Amazon EventBridge Scheduler によってより簡単になりました!](https://techblog.nhn-techorus.com/archives/21467)

- [EventBridgeスケジューラを使ってEC2の定期起動/停止を行う方法](https://dev.classmethod.jp/articles/ec2-schedule-using-eventbridge-scheduler/)
    - 上記2つの記事を見て手順を確認した。注意ポイント（信頼するエンティティの指定方法）など参考になった。


# 6. 所感
- 従来の方法(Lambda + EventBridgeなど)と比べて、本記事の方法はEventBridgeのみで処理が完了するため、一番簡単に設定ができると感じた。今後新規に設定するのであれば、この方法がよいのではと思われる。