COLUMN
【AWS】Amazon EventBridge SchedulerでEC2を定期的に停止・起動し料金を節約する方法
「AWS料金の節約のために、EC2を使用しない時間帯は定期的に停止しておきたい!」 と考えられる方は多いのではないでしょうか。実際に弊社内でも実施していますし、 また、お客さまへAWS導入と合わせてご支援させていただくケースも多々ございます。 |
昨年、Amazon EventBridge Scheduler(以下、EventBridge Scheduler)という新機能が追加されました。EventBridge Schedulerは270を超えるAWSサービスに対応したタスクのスケジューリング機能です。この機能を利用することで、従来よりも簡単にEC2の定期的な停止・起動を実装できるようになったため、今回はその方法をご紹介します。AWS料金の節約の一手段として活用いただければと思います。
1. 従来のEC2の定期的な停止・起動方法
これまではAmazon EventBridgeルール(以下、EventBridgeルール)とAWS Lambda(以下、Lambda)等を組み合わせることで、このEC2の定期的な停止・起動を実装していました。Lambdaを使用するため、EC2起動停止のためのコードの記述・管理や、古くなったランタイムのバージョンアップを実施する必要があるなど、少し手間がかかります。
構成は以下のようなイメージです。
上記構成に、Amazon Simple Notification Serviceを使用したエラー時の通知など機能が加えられた「Instance Scheduler」というソリューションがAWSから提供されており、こちらのテンプレートをお使いの方も多いかもしれません。
2. EventBridge SchedulerによるEC2の定期的な停止・起動方法
さっそく構成から。
従来の方法と比べると、シンプルになっています。
この方法ではLambdaが不要で、EventBridge Schedulerから直接EC2の停止や起動が可能です。
3. 実際にやってみる
今回は例として、以下を想定した設定を行います。
- 日本時間8:00~20:00の時間帯だけEC2を実行状態にする
- 複数のEC2を運用している想定で2台のEC2を対象とする
EventBridge Schedulerは東京リージョンでも提供されているため、ここでは東京リージョンを利用します。
3-1. テスト用のEC2の作成
EventBridge Schedulerで停止・起動をテストするためのEC2インスタンスを2台作成します。
今回は「eventbridge-scheduler-ec2-1」、「eventbridge-scheduler-ec2-2」という名前で作成しています。
既存のEC2を対象にする場合はこの手順をスキップしていただいて問題ありません。後ほど手順3-3にて対象のEC2のインスタンスIDを使用します。
EC2の作成手順についてはこちらもご参照ください。
【第1回】AWS を活用したファイルサーバー構築(EC2-EBS)
https://business.ntt-east.co.jp/content/cloudsolution/column-try-30.html
3-2. 実行用のIAMロールの作成
EventBridge SchedulerからEC2を操作(停止・起動)するためのIAMロールが必要です。
IAMのページから、まずはEC2起動用IAMロールを作成していきます。
「信頼されたエンティティを選択」の画面ではカスタム信頼ポリシーを選択します。
カスタム信頼ポリシーには、EventBridge Schedulerユーザガイドにも記載されている以下のポリシーを設定します。EventBridge Schedulerのサービスプレフィックスは、新しく「scheduler」というものが使われています。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EC2インスタンスを起動するために必要なIAMポリシーを作成します。
上記「ポリシーを作成」ボタンをクリックすると、ブラウザのタブが新しく開きます。こちらのタブでポリシーを作成します。ポリシーの中身は、JSONにて以下を記載します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PolicyForStartEC2Instance",
"Effect": "Allow",
"Action": "ec2:StartInstances",
"Resource": "*"
}
]
}
必要に応じてタグを設定し、IAMポリシーを作成します。ここでは「EC2InstanceStartPolicy」という名前で作成しました。
途中まで進めていたIAMロール作成のブラウザタブに戻り、許可ポリシーの更新ボタンをクリックします。
先ほど作成したIAMポリシーを選択し、次に進みます。
IAMロール名を指定して、「ロールを作成」をクリックします。ここでは「EventBridgeSchedulerEC2Start」という名前にしました。
以上でEC2起動用IAMロールの作成は完了です。
同様の手順にて、EC2停止用IAMロールの作成も行います。ここでは以下の内容で作成しました。
- カスタム信頼ポリシー:上記の起動用と同様の信頼ポリシー
- IAMポリシー:次の通り
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PolicyForStopEC2Instance",
"Effect": "Allow",
"Action": "ec2:StopInstances",
"Resource": "*"
}
]
}
- IAMポリシー名:EC2InstanceStopPolicy
- IAMロール名:EventBridgeSchedulerEC2Stop
3-3. EventBridge Schedulerの設定
下準備が整ったので、EC2の定期的な停止・起動のスケジュール設定をしていきます。
ここでは起動のスケジュール設定から先に実施していきます。
EventBridgeのページを開き、「スケジュールを作成」をクリックします。
スケジュール名を記載します。今回は8:00に起動するので、「EC2StartAt0800」という名前にしました。
頻度は「定期的なスケジュール」を選択します。スケジュールの種類はcron方式で設定していきます。タイムゾーンは後程設定できるため、ここでは日本時間で指定します。フレックスタイムウィンドウは「オフ」にしました。今回は使用していませんが、フレックスタイムウィンドウをオンにして時間を指定すると、その範囲内の時刻でタスクが実行されます。これにより、サービス制限にひっかからないように柔軟に実行時間が変更されるようです。
入力し終わると直近10回分の実行予定日時が表示されるようなので、間違いがないか確認ができます。
タイムゾーンと、スケジュールの開始・終了日時を設定します。ここでは日本時間(UTC +09:00)とし、開始・終了日時は指定せず進めます。
EventBridgeルールではタイムゾーンがUTCのみですが、EventBridge Schedulerでは日本時間で時刻を指定できるため、わかりやすくていいですね。
ターゲットAPIにて「すべてのAPI」を選択し、EC2を選択します。検索BOXを利用すると便利です。
続いて、「StartInstance」を選択します。
起動したいEC2のインスタンスIDを指定します。ここでは、手順3-1で作成したテスト用EC2のインスタンスIDを指定しました。EC2が2台あるため、「,」区切りで記載します。
以上で定期的なEC2起動の設定が完了です。
同様に、定期的なEC2停止の設定を行います。ここでは以下のパラメータを使用しました。その他のパラメータは、起動用のスケジュール設定と同様のパラメータを使用しています。
- スケジュール名:EC2StopAt2000
- 頻度:
cron ( 00 20 ? * MON-FRI * )
- ターゲットAPI:Amazon EC2 → StopInstances
以上ですべての設定が完了です!
それでは上手く動作するか結果を見てみましょう。
3-4. スケジュール実行結果の確認
EC2の定期的な起動
8:00に正常にEC2が起動されるか確認します。
7:59時点
8:00時点
↓
正常に起動されました!
EC2の定期的な停止
20:00に正常にEC2が停止されるか確認します。
19:59時点
20:00時点
↓
正常に停止されました!
以上で、EC2の定期的な停止・起動のスケジュール設定が正常に動作していることが確認できました。
4. EventBridge SchedulerとEventBridgeルールの違い
EventBridge SchedulerとEventBridgeルールは、どちらもAWSにてタスク起動に使用されますが、それぞれ別のサービスであり機能に差分があります。機能の違いはAWS公式ブログに詳細がまとめられていますので、そちらを翻訳・一部編集して引用します。
Amazon EventBridge Scheduler | Amazon EventBridge ルール | |
---|---|---|
スケジュールのクォータ | アカウントあたり 100 万 | アカウントあたり、リージョンごとに 300 ルールの制限 |
イベント呼び出しのスループット | 1,000TPS単位のスループットをサポート | 1分間に300個のスケジュールで、最大5TPS(スケジュールの制限) |
ターゲット | AWS SDKターゲットを使用した 270以上のサービスと6,000以上のAPIアクション | EventBridgeでサポートされる20 以上のターゲット |
時刻表現 | at()、cron()、rate() | cron()、rate() |
タイムゾーン | すべてのタイムゾーンと DST(サマータイム)をサポート |
UTCのみサポート DST のサポートなし |
1 回限りのスケジュール | 可 | 不可 |
タイム ウィンドウ スケジュール | 可 | 不可 |
イベントバスのサポート | イベントバスは不要 | デフォルトバスのみ |
ルールのクォータ消費 |
消費なし 100万スケジュールのソフトリミット |
消費あり バスごとに 2,000 ルールから消費 |
EventBridge Schedulerでは全てのタイムゾーンに対応しているというのが個人的に嬉しいポイントです。
日本時間での指定ができるため、設定がより分かりやすくなりますね。
5. EventBridge Schedulerの料金
無料利用枠として、月あたり1400万回まで無料で利用可能です。それを超える場合、東京リージョンでは100万回あたり$1.25かかります(本コラム執筆時点)。詳細はAWS公式サイトをご参照ください。
毎日数回のEC2起動停止であれば、無料利用枠の範囲内で十分に利用できそうです。
6. まとめ
今回はEventBridge Schedulerを利用した、EC2の定期的な停止・起動による料金の節約方法をご紹介しました。従来よりも簡単に設定ができるようになったのが嬉しいですね。
今後も、クラウドで試してみたことや費用節約の工夫など紹介していきたいと思います!
7. おまけ
「フレックスタイムウィンドウ」を「オン」にし、時間範囲「15分」でSchedulerを設定して何度かタスクを実行してみたところ、予定時刻の2分後、11分後、13分後等、毎回バラバラの時刻にタスクが実行されました。
同時刻に処理が発生するスケジュール設定のタスクが増えてくると、AWSのクォータにひっかかる可能性が出てくるため、時刻が厳密に決まっているタスクから優先的に「フレックスタイムウィンドウ」を「オフ」とし、それ以外のものを「オン」として時間に柔軟性を持たせるのが良いのかなと思います。
※Amazon Web Services(AWS)は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。RECOMMEND
その他のコラム
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。