EventBridge SchedulerでEC2を平日の日中だけ起動して利用する方法(AWS CLI)

「EC2を平日の日中だけ起動して利用する(それ以外の時間帯以外は停止する)」という運用を実施するにあたって、以前までは「EventBridge+Lambda」で自動化していましたが、2022/11/10に発表されたEventBridge Schedulerが利用できるようになった事で、これ以外にも様々なリソースの自動停止が可能となりました。

本記事では、EC2を平日の日中だけ稼働させる方法を紹介します。

EventBridge Schedulerとは

概要

サーバーレススケジューラで、一元化されたマネージドサービスからタスクを作成、実行、管理できます。

  • タイムゾーンを指定して定期的または1回限りのタスクを実行することができる
  • 決められた時間に起動するだけでなく特定の時間枠のどこかで起動することも可能
  • 270以上のAWSサービスをターゲットとしてサポートしているため、ルールでは直接呼び出せなかったサービスも呼び出せる

料金

EventBridge Schedulerを利用する場合の料金となります。

  • 月間1400万回の呼び出し:無料
  • 月間1400万回以上:100万回あたり1.25USD

設定方法

設定は以下手順となります。すべての手順で、EC2の起動と停止の2つが必要となります。

  1. IAMポリシー作成×2*1
  2. IAMロール作成×2
  3. 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:グループを自分で作成して管理したい場合は、スケジュールグループ作成を先に実行します。

執筆担当者プロフィール
相澤 萌々子

相澤 萌々子(日本ビジネスシステムズ株式会社)

クラウドソリューション本部 AWSのインフラにかかわる業務に携わっています。

担当記事一覧