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

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

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

# 3. AWS Instance Schedulerとは（自分の理解）
- AWS社が、AWSのサービスを組み合わせて提供する便利な仕組みがAWSソリューションであり、このInstance Schedulerもそのソリューションの1つ。
- 今まで動作確認したEventBridgeベースのやり方と比較して、より詳細に設定ができる様子。（タグによる対象インスタンスの紐づけ、マルチアカウント対応など）
- AWS公式の「[実装ガイド](https://d1.awsstatic.com/Solutions/ja_JP/instance-scheduler-on-aws.pdf)」の初版の日付が2018/2になっており、その頃リリースされた様子。
- [GitHub上の更新履歴](https://github.com/aws-solutions/instance-scheduler-on-aws/blob/main/CHANGELOG.md)を見ると、本記事執筆時点(2023/5)での最終更新が2023/4/27(v1.5.0)となっており、ある程度継続的にアップデートされている様子。


# 4. 構成図

![ins49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/785f982c-69b4-3c1a-935e-5666b9e6b3d1.png)




# 5. 手順

## 5.1 事前準備
- 自動起動・停止の対象とするEC2インスタンスを作成する。このインスタンスに指定のタグ付けをすることにより、自動起動・停止の操作を行う。

## 5.2 CloudFormationスタックの起動
- 実装ガイドに従い設定を行う。
- まず、AWS公式の「[AWS Instance Schedulerのサイト](https://aws.amazon.com/jp/solutions/implementations/instance-scheduler-on-aws/)」にアクセスする。

![ins41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/becc0c88-9dbb-6387-6926-18967cc51b97.png)

- 「AWSコンソールで起動する」ボタンを押して、CloudFormationの画面を開く。
- 最初、リージョンがN.Virginiaになっているため、自分のデプロイしたいリージョンに変更する。

![ins42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ef61b3e2-1ed3-8877-d443-86e13a01f33e.png)

- 各種パラメータを設定する。今回はDefault time zone のみUTCからAsia/Tokyoに変更し、スタックを作成する。


![ins43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/5c52c66c-b60e-6f75-475d-5432e8a4e91b.png)

## 5.3 スケジュールの登録
- CloudFormationの展開が完了すると、DynamoDBにテーブルが作成されている。
- DynamoDB > テーブル > mksamba-instance-scheduler-stack-ConfigTable-17FIE4NQ8HOSZ を選択し、「テーブルアイテムの探索」を選択し、テーブルの中身を表示する。

![ins44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/640cf180-d9fd-c49e-aaa6-2314aca6ca50.png)

- インスタンスの起動停止のスケジュールは、ここで値を直接編集するか、専用のCLIを用いて設定する。今回は簡易的な検証のため、値をGUIから直接編集する。

- 「period」で「インスタンスが起動しているべき時間」を設定し、「schedule」で複数の「period」をまとめる。その上で「schedule」をインスタンスに対して設定する。

- 平日9:00AM～21:00PMにインスタンスを起動させるperiod「mksamba-period-weekday」を作成する。

![ins45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/c4a27b05-7841-9ce9-b48e-1142e30044cb.png)

- 作成したperiodを内包するschedule「mksamba-schedule-weekday」を作成する。

![ins46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e3da4790-eed0-7d26-7ab2-575abd76b06b.png)

- インスタンスへのスケジュールの適用はタグを用いて行う。対象のインスタンスに対し、「Key=Schedule」、「Value=mksamba-schedule-weekday」を設定する。

![ins47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/09134b4d-233b-9fb6-471a-9c349d2b4168.png)

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

- 火曜日の10:00AM頃、上記のスケジュール設定(平日9:00AM～21:00PMは起動すること)済の状態で、停止中のインスタンスタンスにタグ付けを行った。インスタンスの起動状態を制御するLambda関数が5分おきに動作するため、10:15AMに自動でインスタンスが起動された。
- 検証のため、10:33AM頃、DynamoDBのテーブル内の「period」の曜日の値を「MON-FRI」から「WED-FRI」に変更した。設定変更後のLambda実行タイミング(10:35AM)にて、自動でインスタンスが停止された。

![ins48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/ebb2b179-f991-1284-7f8e-6d5990b24a44.png)

# 6. 参考
- [AWS での Instance Scheduler](https://aws.amazon.com/jp/solutions/implementations/instance-scheduler-on-aws/)
    - AWS公式による本ソリューションの紹介サイト。
- [Instance Schedulerを使ってEC2の稼働時間を管理してみた](https://zenn.dev/yuta28/articles/ec2-schedule)
    - CLIでの設定なども含め各種機能を実機確認している記事。

# 7. 所感
- 単純に指定の時刻に起動・停止を行うわけではなく、「起動しているべき時間」を定義し、例えば「停止しているべき時間」にインスタンスが起動している場合には即座に停止されるという仕様であることなどから、単純に定時に起動・停止を行うだけでなく、より精緻に管理をしたい場合などマッチするのではと感じた。