【コスト削減】AWS EC2インスタンス 夜間休日自動停止方法 (2) AWS Systems Manager Automation + Amazon EventBridge

# 1. はじめに
- AWS環境のコスト削減に取り組んでいる。コスト削減の一番ベーシックな対策である、EC2インスタンスの夜間休日の自動停止方法について、いくつかやり方があるようなので、それぞれ試してみて、難易度やメリット・デメリットを比較する。
- 本記事ではシンプルかつノーコードで設定できる方法(Systems Manager Automation + EventBridge)の動作確認を行う。

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

# 3. 構成図

![ins構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a89ea828-21a2-728f-d3b4-d5ea6af36198.png)




# 4. 手順

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

## 4.2 IAMロールの作成
- EventBridgeに対し、SSM Automationを呼び出すことを許可する権限を付与する必要があり、そのためのIAMロールを作成する。
- IAM -> ロール -> ロールを作成 ->「信頼されたエンティティタイプを選択」にて、「一般的なユースケース」-> 「EC2」を選択する。

![ins11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/570fac24-f955-aad7-5a83-dfad8705f947.png)

:::note info
このロールの作成時、最初から信頼されたエンティティを「EventBridge」にしたいが、2023/5現在、その指定ができないので、いったんEC2などの別のエンティティを選択し後で変更する。
:::

- 許可ポリシーとして、「AmazonSSMAutomationRoleを選択する。

![ins12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/2d1aef8b-428c-92de-a35c-db4f21af43c3.png)

- ロール名(mksamba-AmazonSSMAutomationRole)を付けて、いったんロールを作成する。

![ins13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/443ddec6-21fe-d80c-e436-7f0614141793.png)

- 作成したロールを開き、「信頼関係」のところの「信頼されたエンティティ」内のJSONにて、「ec2.amazonaws.com」を「events.amazonaws.com」(EventBridgeサービス)に変更する。

![ins14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/8cae0a15-e5e4-7729-0532-1dc9037e125b.png)


## 4.3 EventBridgeからのSSM Automation ドキュメントの呼び出し


- インスタンス停止を行うSSM Automation ドキュメントを呼び出すEventBridgeルールを作成する。
- Amazon EventBridge > ルール > ルールを作成にて、ルール名「mksamba-instance-stop-SSM
」とし、ルールタイプは「スケジュール」を選択し、「続行してルールを作成する」に進む。

![ins15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6561735d-eff3-7b61-60df-4eecaf15f971.png)

- 月～金の21:00PMに動作するよう、cron式を設定する。今回は「0 12 ? * MON-FRI *」で設定。動作スケジュールの確認はJSTで可能だが、CRON式はUTCで入力する必要がある。

![ins16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ba467115-1d7e-a589-3f37-769c87bcc041.png)

- ターゲット(時間になったら実行する内容)として、「AWSのサービス」->「Systems Manager オートメーション」-> 「AWS-StopE2Instance」を選択し、対象のInstanceIdを入力し、実行ロールとして前の手順で作成した「mksambaSSMAutomationRole」を選択し、ルールを作成する。

![ins17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/84c72d97-2ee3-3ee4-7316-c76002eca862.png)
![ins18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6c7d43f0-caeb-9fa7-8ecb-379a2dfd09f5.png)

- 同様に、インスタンス開始を行うSSM Automation ドキュメントを呼び出すルール「mksamba-instance-start-SSM」を作成する（画面は省略）。開始は月～金の9:00AMとするため、CRON式は「0 0 ? * MON-FRI *」となる。また、実行するSSMオートメーションドキュメントは「AWS-StartEC2Instance」となる。

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

- 検証用に、13:59に起動、14:02に停止するようにEventBridgeの時刻設定を変更する。

- SSM Automation の実行ログは以下のようになる。

![ins19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/9f45dbf4-3980-aca4-12c5-30cc6d661b6f.png)
![ins20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5df0ed38-1fcf-fd96-fdac-85043d6c4f5a.png)


- Cloudtrailのログは以下のようになる。

![ins21a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a91caf3b-39ec-5bf0-0142-19bdc6979054.png)


# 5. 参考

- [Amazon EventBridge と AWS Systems Manager オートメーション を使用したEC2インスタンスの起動、停止の自動化](https://dev.classmethod.jp/articles/ec2-automation-with-systemsmanage-and-eventbridge/#toc-2)
    - Systems Manager Automation + EventBridge を使った手順を詳細に説明。こちらの記事を参考に本記事も後追い検証させて頂いた。

- [【AWS】EC2の自動起動・自動停止を実装する方法](https://bftnagoya.hateblo.jp/entry/2022/02/14/081454)
    - 上記記事同様、Systems Manager Automation + EventBridgeを使用した手順の解説。


# 6. 所感
- SSM Automation を初めて使った。今回は既定（出来合い）のドキュメントを使用したが、ドキュメントを修正することで動作のカスタマイズが可能であり、SSM Automation に慣れている人にマッチする方法かなと思った。