「EC2を平日の日中だけ起動して利用する(それ以外の時間帯以外は停止する)」という運用を実施するにあたって、以前までは「EventBridge+Lambda」で自動化していましたが、2022/11/10に発表されたEventBridge Schedulerが利用できるようになった事で、これ以外にも様々なリソースの自動停止が可能となりました。
本記事では、EC2を平日の日中だけ稼働させる方法を紹介します。
EventBridge Schedulerとは
概要
サーバーレススケジューラで、一元化されたマネージドサービスからタスクを作成、実行、管理できます。
- タイムゾーンを指定して定期的または1回限りのタスクを実行することができる
- 決められた時間に起動するだけでなく特定の時間枠のどこかで起動することも可能
- 270以上のAWSサービスをターゲットとしてサポートしているため、ルールでは直接呼び出せなかったサービスも呼び出せる
料金
EventBridge Schedulerを利用する場合の料金となります。
- 月間1400万回の呼び出し:無料
- 月間1400万回以上:100万回あたり1.25USD
設定方法
設定は以下手順となります。すべての手順で、EC2の起動と停止の2つが必要となります。
- IAMポリシー作成×2*1
- IAMロール作成×2
- EventBridge Schedulerのスケジュール作成×2
IAMポリシー作成
IAMポリシーは、EC2を起動させるポリシーと停止させるポリシーの2つを作成します。
EC2起動用 | EC2停止用 |
---|---|
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:StartInstances" ], "Resource": "*" } ] } |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "ec2:StopInstances" ], "Resource": "*" } ] } |
IAMロール作成
IAMロールもIAMポリシーと同様、EC2起動用と停止用の2つを作成します。
それぞれ上記IAMポリシーを適用し、「信頼されたエンティティ」には以下JSONを設定します。
EC2起動用/停止用 |
---|
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } |
EventBridge Schedulerのスケジュール作成
平日の日中のみ稼働させるためには、EC2起動用とEC2停止用の2つを作成します。
今回は、AWS CLIを利用して実装する方法を記載してます。
※ 設定値はサンプルとなります。実装する場合は適宜変更してください。
EC2起動用スケジュール
設定項目 | 設定値 | 備考 |
---|---|---|
名前 | test-start | ー |
スケジュールグループ名 | default*2 | 初めからdefaultが作られている |
開始時間 | cron(0 9 ? * MON-FRI *) | 月曜日から金曜日9時に起動 |
タイムゾーン | Asia/Tokyo | ー |
フレキシブルタイムウィンドウ | OFF | 設定時間との誤差を設定 |
アカウントID | 123456789012 | ー |
IAMロール | test-start | 上記で作成したEC2起動用のIAMロール |
対象インスタンスID | i-12345678901234567,i-09876543210987654 | ー |
リージョン | ap-northeast-1(東京) | ー |
AWS CLIのコマンドは以下となります。
aws scheduler create-schedule --name test-start --group-name default --schedule-expression "cron(0 9 ? * MON-FRI *)" --schedule-expression-timezone "Asia/Tokyo" --flexible-time-window '{"Mode": "OFF"}' --state ENABLED --target '{"RoleArn": "arn:aws:iam::123456789012:role/test-start", "Arn": "arn:aws:scheduler:::aws-sdk:ec2:startInstances", "Input": "{\"InstanceIds\" : [\"i-12345678901234567\",\"i-09876543210987654\"] }" }' --region ap-northeast-1 |
EC2停止用スケジュール
設定項目 | 設定値 | 備考 |
---|---|---|
名前 | test-stop | ー |
スケジュールグループ名 | default | 初めからdefaultが作られている |
開始時間 | cron(0 18 ? * MON-FRI *) | 月曜日から金曜日18時に停止 |
タイムゾーン | Asia/Tokyo | ー |
フレキシブルタイムウィンドウ | OFF | 設定時間との誤差を設定 |
アカウントID | 123456789012 | ー |
IAMロール | test-stop | 上記で作成したEC2停止用のIAMロール |
対象インスタンスID | i-12345678901234567,i-09876543210987654 | ー |
リージョン | ap-northeast-1(東京) | ー |
AWS CLIのコマンドは以下となります。
aws scheduler create-schedule --name test-stop --group-name default --schedule-expression "cron(0 18 ? * MON-FRI *)" --schedule-expression-timezone "Asia/Tokyo" --flexible-time-window '{"Mode": "OFF"}' --state ENABLED --target '{"RoleArn": "arn:aws:iam::123456789012:role/test-stop", "Arn": "arn:aws:scheduler:::aws-sdk:ec2:stopInstances", "Input": "{\"InstanceIds\" : [\"i-12345678901234567\",\"i-09876543210987654\"] }" }' --region ap-northeast-1 |
参考(スケジュールグループ作成)
EventBridge Schedulerはデフォルトで[default]のグループが作成されていますが、自分で管理する場合はグループを先に作成し、ルール作成時のグループ名で指定します。
設定項目 | 設定値 | 備考 |
---|---|---|
スケジュールグループ名 | test-group | 作成しない場合はdefaultを利用する |
リージョン | ap-northeast-1 | ー |
AWS CLIのコマンドは以下となります。
aws scheduler create-schedule-group --name test-group --region ap-northeast-1 |
おわりに
平日の日中だけEC2を起動することで、EC2の停止忘れを抑えることができます。
マルチアカウント構成で同じスケジュール設定を実装する際には、AWS CLIで設定するほうがはやくできるので、無理なく料金の見直しをする際ぜひ参考にしてください。
また、EC2インスタンスで平日の日中以外の作業が必要になった場合も、EventBridge Schedulerのコンソール画面からすぐに「有効化」「無効化」をクリック一つで実施できます。
*1:IAMポリシーとIAMロールは起動と停止をまとめて1つにすることも可能ですが、権限を絞るために本記事では分割した方法を記載します。
*2:グループを自分で作成して管理したい場合は、スケジュールグループ作成を先に実行します。