本文書ではEC2の起動/停止をManagement ConsoleからではなくAmazon EventBrideスケジューラを利用して決められたスケジュールに基づいて起動/停止させる方法について説明しています。EC2では稼働している時間やデータ転送量によって課金されるので業務時間以外では停止しておきたいものです。設定は非常に簡単なのでEvent Bridgeスケジューラの機能をうまく活用することでAWSの運用コストを下げることができます。

動作確認を行うため事前にAWS上にEC2インスタンスを作成しておく必要があります。作成についてはこちらの記事を参考にしてください。

Lambda関数によるEC2の起動/停止の方法については下記の文書で公開しています。

EventBridgeスケジューラとは

マネージドなサーバレスのスケジューラーで毎日決められた時間にLambda関数を実行したり、決まられた時間にEC2のインスタンスを起動/停止したりすることができます。設定はManagement ConsoleだけではなくAWS CLI, AWS SDKからも可能なのでLambda関数からスケジュールの設定を行うことも可能です。

スケジュールにはRate-based, Cron-based, One-timeの3つのタイプがあります。Rate-basedでは指定の時間間隔で繰り返し定期実行が可能です。Cron-basedはLinuxで利用されるcronと同様の書式で定期実行が可能です。One-timeは指定したタイミングで一度実行することができます。

EventBrideスケジューラについてより詳しく知りたい場合はAmazon EventBridge Scheduler【AWS Black Belt】の動画などが参考になります。

EventBridgeスケジューラの設定

EventBridge Schedulerを利用することでEventBridge Schedulerから直接EC2インスタンスの起動、停止を定期的に行うことができます。本文書では動作確認で一回限りの実行を行い、月曜日から金曜日の営業日の9:00に起動して18:00に停止する設定を行っていきます。

IAMロールの設定

EventBridgeスケジューラではEC2のインスタンスの起動/停止を行うためのポリシーをもったIAMロールを指定する必要があります。EC2のインスタンスの起動/停止だけの権限を持つポリシーを作成することができますがここではAmazonEC2FullAccessポリシーを利用します。

Management ConsoleのIAMのロールからロールの作成を行います。信頼されたエンティティを選択では”カスタム信頼ポリシー”を選択してPrincipalの値にscheduler.amazon.comを設定します。

ロールの作成、信頼されてエンティティ
ロールの作成、信頼されてエンティティ

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

”許可を追加”画面ではAmazonEC2FullAccessを選択してください。

許可を追加
許可を追加

次へボタンで進みロールに任意の名前をつけてロールの作成を完了させてください。

スケジュールの設定

EC2インスタンスの起動を行うように設定を行うので設定前にインスタンスを停止させておいてください。

Management ConsoleからAmazon EventBrideサービスにアクセスして左側のサイドメニューからスケジューラのスケジュールをクリックしてください。

Amazon EventBrider Schedulerコンソール
Amazon EventBrider Schedulerコンソール

一回限りの設定で動作確認

Amazon EventBrideサービスの画面にある”スケジュールを作成”ボタンをクリックします。最初にスケジュールの名前をつけます。動作確認のためスケジュールのパターンでは一回限りのスケジュールを選択して日付と時刻を設定します。動作確認ですぐに結果を知りたいので数分後を設定してください。

フレックスタイムウィンドウではオフに設定します。オフに指定した場合には設定した時刻に実行されます。フレックスタイムウィンドウで時間を選択すると実行がその時間内に行われるように設定されます。15分を設定する実行時刻から15分以内で実行されます。

スケジュールの設定画面
スケジュールの設定画面

次へボタンをクリックするとターゲットの選択画面が表示されます。EC2インスタンスの起動を行うためターゲットAPIですべてのAPIを選択してEC2を選択するとAmazon EC2が表示されるので選択します。

ターゲットの詳細
ターゲットの詳細

さらにAmazon EC2のサービスからEC2インスタンスを起動するStartInstancesを選択します。

ターゲットの詳細
ターゲットの選択 オプション

StartInstancesでは起動を行いたいインスタンスのIDをJSONで設定します。複数のインスタンスIDを配列で設定することができます。各自の環境の起動したいEC2インスタンスのIDをMyDataに設定して次へボタンをクリックしてください。

インスタンスIDの設定
インスタンスIDの設定

設定画面ではスケジュールの有効化やスケジュール完了後のアクションを設定することができます。失敗した場合に再試行も行えますがここでは再試行は無効にしておきます。

スケジュールの設定
スケジュールの設定

設定画面をスクロールするとロールを設定する箇所があるので作成したロールを設定してください。

実行するロールの設定
実行するロールの設定

次へボタンを押すと確認画面が表示されるのでそのまま作成を行ってください。

一回限りの設定なのでその時刻になるとスケジュールが実行されます。

実行時刻経過後にEC2のインスタンスが起動しているか確認してください。実行したかどうはCloudTrailサービスのイベント履歴から確認することができます。

Cloud Trailでのイベント履歴の確認
Cloud Trailでのイベント履歴の確認

Cron-basedによる設定

スケジュールの作成方法は一回限りのスケジュールと同じですが、定期的なスケジュールではcronベースかrateベースでスケジュールを設定します。

月曜日から金曜日の18:00にEC2インスタンスを停止したい場合のCronの設定はドキュメントのSchedule expressions using rate or cronを参考に行いました。

Cronベースのスケジュールの設定
Cronベースのスケジュールの設定

EC2のインスタンスを停止するのでターゲットのAPIにはAmazon EC2のStopInstancesを選択してください。

EC2のインスタンスの停止を選択
EC2のインスタンスの停止を選択

後は一回限りのスケジュールと同様に設定を行ってください。EC2の起動についてもCron-basedのスケジュールを利用して別のスケジュールで登録を行ってください。一回限りのスケジュールで動作が確認できているので特に問題もなくスケジュール通りに起動、停止が行われるはずです。これで設定作業は完了です。

EventBridgeスケジューラを利用することで短時間で簡単にEC2のインスタンスの起動・停止の定期的なスケジュール設定を行うことがわかりました。