Amazon EventBridge スケジューラでEC2を自動起動/停止させる方法について

2022年11月にAmazon EventBridgeの新機能として、スケジューラの機能が提供されていました!
aws.amazon.com
この機能によってLambdaなど他のサービスを介すことなく、Amazon EventBridgeから直接EC2などのAPIをスケジュール可能になりました。
今回はAmazon EventBridgeのスケジューラ機能について、概要やユースケース、設定方法についてご紹介します!

Amazon EventBridgeとは

Amazon EventBridgeとはイベント駆動型アーキテクチャで、何らかの「イベント」が発生した際に処理を起動させるサービスになります。

「イベント」の例:メッセージの受信、プロセスの完了、リソースの変化 etc...

ユースケースとしては、システム異常を感知して連携したり、ワークフローの起点として利用されたりするサービスです。

そして今回提供が開始されたスケジューラは、タスクやイベントの実行時間を指定することができる機能です。

スケジュールを指定してイベントのトリガーとなる点ではAmazon EventBridgeのルール機能と大して変わらないように見えますが、スケジュール機能とルール機能の違いとしては大きく4点あります。

スケジュール指定時のタイムゾーン ターゲットとして選択可能なAWSサービスの数 1回限りのスケジュール設定 フレックスタイムウィンドウ
ルール機能 UTCのみ 20以上のターゲット 設定不可 設定不可
スケジューラ機能 JSTを選択可能 270以上のサービスと6,000以上のAPI 設定可能 設定可能

aws.amazon.com

ターゲットの数が桁違いに増加していることや、イベントを実行するスケジュールをより詳細に設定できるようになっていますね。

タイムゾーンがUTCのみではなく選択できるようになっていることも個人的にはすごくありがたいです!

このスケジューラ機能を使用するユースケースとして、今回はEC2の自動起動/停止の設定についてご紹介します。

なぜEC2の自動起動/停止設定?

なぜEC2の自動起動/停止設定をテーマとして選んだかというと、個人的にこの設定にすごく助けられているからです。

AzureにはVMの「自動シャットダウン」という機能がありますよね。

この機能のおかげでVMを使い終わった後に停止し忘れていた。。という時でも、少しは無駄なコストの発生を抑えることができています。

(それでも多少は無駄な稼働コストが発生しているので、使い終わったら停止するということはしっかり習慣化していないといけませんね。。)

しかし、AWSにはこの「自動シャットダウン」機能がありません。
また、AzureにしてもAWSにしても、サーバーの起動を自動化してくれる機能はありません。

もし毎日決まった時間に起動/停止をしなければいけないという場合、毎回手動でコンソールもしくはAWS CLIから操作するのは面倒ですし、忘れてしまう可能性もあります。

これまではEC2の自動起動/停止の仕組みをAWSのリソースをいくつか繋げて設定していましたが、スケジューラ機能の提供によって構成がかなりシンプルになり、設定がはるかに楽になりました!

そこで、スケジューラ機能による構成の変化についてご紹介します!

スケジューラ機能によるEC2自動起動/停止設定の構成の変化

従来のEC2自動起動/停止設定の簡単な構成図がこちらになります。

以前はEventBridgeのターゲットとしてEC2が選択できなかったため、Lambdaを介する構成となっていました。

そのためLambdaに設定するコードを書かなければならなかったり、EC2に付与されたタグ機能によって対象インスタンスを識別する仕様にしていたため、EC2に自動起動/停止設定用のタグを設定する必要がありました。

そして、Amazon EventBridgeのスケジューラを使用したEC2自動起動/停止設定のイメージは下図になります。

EventBridgeから他のリソースを介さず直接EC2に繋がっていて、すごく単純な図になりました!

設定にかかる時間もすごく減って楽になったので、ぜひ皆さん試してみてください。

設定方法

では、Amazon EventBridge スケジューラを使用したEC2の自動起動/停止の設定方法についてご紹介します。

(コンソール画面は2023年5月現在の仕様のものです。)

設定項目としては下記3つになります。

  1. EC2の起動/停止を許可するIAMポリシーの作成
  2. 実行ロールの作成
  3. Amazon EventBridge スケジューラ作成

※起動/停止を行うEC2が用意されていることを前提とするため、EC2の作成方法については省略します。

IAMポリシーの作成

EC2の起動/停止を許可するポリシーを作成します。
 1. IAMポリシー作成画面を開き、アクセス許可の指定にて

 2. 「アクション許可」項目の検索窓にstartとstopをそれぞれ入力して[StartInstances]および[StopInstances]にチェックを入れる

 3. 「リソース」項目にて、[すべて]を選択する

 4. 「確認して作成」画面にて、ポリシー名、説明、タグ(必要に応じて)を入力して、[ポリシーの作成]ボタンをクリックする

 5. 作成したポリシーのJSONコードで、下記のようにEC2に対して起動/停止アクションが許可されていることを確認する

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "*"
        }
    ]
}

実行ロールの作成

EventBridge スケジューラ用のIAMロールを作成いたします。
 1. IAMロールの作成画面にて、「カスタム信頼ポリシー」を選択し下記ポリシーを記入する

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

 2. 「許可を追加」画面にて、『EC2の起動/停止を許可するポリシーの作成』で作成したポリシーを選択する

 3. 「名前、確認、および作成」画面にて、ロール名、説明、タグ(必要に応じて)を入力して、[ロールを作成]ボタンをクリックする


Amazon EventBridge スケジューラの作成

 1. Amazon EventBridgeページの左ペインの中から「スケジュール」を選択し、[スケジュールを作成]をクリックする

 2. 「スケジュール名と説明」の項目を入力する スケジュールグループは「default」を選択する

 3. スケジュールのパターンを入力する 1回限りもしくは定期的なパターンを選択できるため、用途に応じて選択する
今回は1回限りのスケジュールを選択するため、起動もしくは停止させたい日時を設定する
フレックスタイムウィンドウ*では、「オフ」を選択する

フレックスタイムウィンドウで時間を指定すると、指定した時間の枠以内でアクションが実行されます。
RDSのメンテナンスウィンドウの「期間」と似ていますね。
また、今回のように「オフ」を選択すると指定した時間ぴったりにアクションが実行されます。

また、定期的なスケジュールを設定する場合は、cron式での日時の設定に加えて、スケジュールの開始/終了日時を設定することが可能

 4. スケジュールのターゲットを設定する
「ターゲットの詳細」項目にてAmazon EC2を選択し、「StartInstances」もしくは「StopInstances」のAPIを選択する
(今回は自動起動のスケジュール作成のため、「StartInstances」を選択)

 5. APIに渡すパラメータを含むJSONを設定する
JSONコードの中の"MyData"と記載されている部分に、起動/停止させたいEC2のインスタンスIDを入力する

 6. アクセス許可のロールを割り当てる
ステップ3の「設定」画面の「アクセス許可」項目にて、[既存のロールを使用]を選択して上記『実行ロールの作成』で作成したIAMロールを選択する

 7. その他の項目についてはデフォルトのまま[次へ]をクリックし、 確認画面で[スケジュールを作成]をクリックする

以上でスケジュールの作成は完了となります。

起動/停止確認について

上記で作成したスケジュールで指定した時間に、EC2が起動/停止したかどうかを確認する方法についてご紹介します。

確認方法としては2つあります。

1つは、直接EC2コンソールから確認することです。

対象のインスタンスを検索し、インスタンスの状態]を確認することで確認することは可能です。

また、インスタンス概要の「起動時刻」という項目にてインスタンスが起動した時刻を、「状態遷移の理由」という項目にて停止した時刻の確認が可能です。

しかし、その起動や停止がEventBridgeによって実施されたものかどうかという確認はできません。

そこでもう1つの方法としては、CloudTrailのイベント履歴から確認することです。
CloudTrailでは、下記4種類のイベントタイプを識別して追跡することが可能です。

  • RunInstances
  • StartInstances
  • StopInstances
  • TerminateInstances

起動確認の場合は[StartInstances]、停止の場合は[StopInstances]でイベント履歴を検索することで、対象のインスタンスが起動/停止した時刻が分かるようになります。

またユーザー名やイベントレコードの中身を確認することで、「誰が」イベントを実施したのかということが分かります。

CloudTrailコンソールでの確認方法については下記になります。
 1. CloudTrailコンソールのイベント履歴を開く

 2. 「ルックアップ属性キーを選択」というプルダウンの中から[リソース名]を選択して、「ルックアップ値を入力」にて対象EC2のインスタンスIDを入力する。

 3. イベント名と時間から対象のイベントを見つけ、イベント名をクリックする

 4. 詳細画面の「イベントレコード」項目にて、userIdentityのarnから上記IAMロール作成手順にて作成したものであることを確認する

EventBridge スケジュールの実施確認については以上となります。

お客様環境の作業などにおいては、起動/停止の時間も証跡の一つとして明確に残す必要があったりするので、EC2コンソールの曖昧な項目名による情報よりもCloudTrailのイベント履歴から確認するほうが確実で良いなと思い紹介させていただきました。

まとめ

本記事では、EventBridgeのスケジュール機能についての紹介と、それを使用したEC2インスタンスの自動起動/停止設定を行う方法やその確認方法について記載しました。

EventBridgeのスケジュール機能自体は2022年11月に発表されたもので、新機能というには少し遅いため、リソースのアップデート情報は早めにキャッチアップしていきたいなと思いました。

また、自分はCloudTrailをあまり触ったことがなかったため、このようなイベントのログを明確に見ることができることが分かり勉強になりました。
EC2の自動起動/停止の設定については、やっておいて損はないものだと思うのでぜひ参考にしていただければと思います!

執筆担当者プロフィール
徐 一静

徐 一静

クラウドソリューション本部所属。主にAWSに関連する設計、構築を担当しています。Azureでも設計/構築経験ありです。 趣味はお笑いライブに行くことです。

担当記事一覧