ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

【図解あり】Amazon EventBridge ScheduleでEC2インスタンスをスケジュール起動/停止させてみた

こんにちは。絶賛AWS猛勉強中の藤川です。

2022/11/10にAmazon EventBridgeで新しいスケジューラの提供という新機能が発表されました。 aws.amazon.com

検証作業等を実施していると、EC2インスタンスの停止を忘れてしまっていて、何にもしていないつもりなのに費用が発生し続けていることがあります。少額であれば良いのですが、インスタンスタイプによっては高額になってしまい、気づいたときには"時すでに遅し"ということもあるかもしれません。

これを未然に防ぐために、EventBridgeとAWS Lambdaを使用してEC2インスタンスをスケジュール起動/停止する仕組みを導入されていた方もいらっしゃるかと思いますが、初心者には少々難しい部分もありました。Amazon EventBridge Scheduleのみで、"とても簡単に"設定することができるようになりましたので、自己学習も兼ねて、ご紹介したいと思います。

方針

  • Amazon EventBridge Scheduleを使用して、EC2インスタンスの起動、並びに停止を実施します。

Amazon EventBridge Scheduleについて

  • タイムゾーンを指定して、繰り返し、もしくは1回限りのタスクを実行することができます。
  • 決められた時間に起動するだけでなく特定の時間枠のどこかで起動といったことができます。
  • 200 を超える AWS のサービスを横断したタスクをスケジュールすることができます。

設定方法

設定方法は、以下の 2 ステップのみとなります。

(1)EventBridge用のIAMロールの作成
(2)EventBridge Scheduleの作成

(1)EventBridge用のIAMロールの作成

EventBridgeにSystems Managerを操作するための権限を与えるためにIAMロールを作成していきます。

  1. IAMコンソールを開き、[ロールを作成]をクリックします。
  2. 信頼されたエンティティタイプにて、「AWSのサービス」を選択し、ユースケースにて、「EC2」を選択して、[次へ]をクリックします。
  3. 許可ポリシーに「AmazonSSMAutomationRole」を入力して検索し、「AmazonSSMAutomationRole」を選択し、[次へ]をクリックします。
  4. ロール名に任意の名前を入力後、[ロールの作成]を選択し、IAMロールを作成します。
  5. 作成したロールを開き、信頼関係タブを選択し、[信頼ポリシーを編集]をクリックします。
  6. Principalの「ec2.amazonaws.com」を「scheduler.amazonaws.com」のように変更します。 → IAMロール作成時に「scheduler.amazonaws.com」を設定できれば良いのですが、現時点(2022年12月)では設定できないため、作成後に編集しています。

(2)EventBridge Scheduleの作成

EventBridge Scheduleで、起動用と停止用のルールをそれぞれ作成します。

起動ルールの作成

  1. EventBridgeコンソールから、[スケジュール]を選択し、[スケジュールを作成]をクリックします。
  2. スケジュール名にEC2インスタンス起動用と分かる任意の名前を入力します。
  3. スケジュールのパターンにて、以下を設定します。
    1. 「定期的なスケジュール」を選択し、cronベースのスケジュールを入力します。
      → 「cron(0 10 ? * MON-FRI *)」を設定することで、月曜日〜金曜日のAM10:00にトリガー(今回の場合は、EC2インスタンスが起動)されるようになります。
    2. フレックスタイムウインドウは、「オフ」を選択します。
    3. その他は、デフォルトで、[次へ]をクリックします。
  4. ターゲットAPIにて、「Amazon EC2 StartInstances」を選択します。
  5. 以下のJSONコードを設定し、[次へ]をクリックします。
    → “I-0683e7e5904b3****”は、設定したいEC2インスタンスのインスタンスIDを入力してください。
  6. アクセス許可にて、[既存のロールを使用]を選択し、ロールを選択にて、先ほど作成した「EventBridge用のIAMロール」を選択し、その他はデフォルト値のまま、[次へ]をクリックします。
  7. 設定値を確認し、[スケジュールを作成]をクリックします。

停止ルールの作成

  1. EventBridgeコンソールから、[スケジュール]を選択し、[スケジュールを作成]をクリックします。
  2. スケジュール名にEC2インスタンス停止用と分かる任意の名前を入力します。
  3. スケジュールのパターンにて、以下を設定します。
    1. 「定期的なスケジュール」を選択し、cronベースのスケジュールを入力します。
      →「cron(0 18 ? * MON-FRI *)」を設定することで、月曜日〜金曜日の18:00にトリガー(今回の場合は、EC2インスタンスが停止)されるようになります。
    2. フレックスタイムウインドウは、「オフ」を選択します。
    3. その他は、デフォルトで、[次へ]をクリックします。
  4. ターゲットAPIにて、「Amazon EC2 StopInstances」を選択します。
  5. 以下のJSONコードを設定し、[次へ]をクリックします。
    → “I-0683e7e5904b3****”は、設定したいEC2インスタンスのインスタンスIDを入力してください。
  6. アクセス許可にて、[既存のロールを使用]を選択し、ロールを選択にて、先ほど作成した「EventBridge用のIAMロール」を選択し、その他はデフォルト値のまま、[次へ]をクリックします。
  7. 設定値を確認し、[スケジュールを作成]をクリックします。

動作確認

AM10:00前の状態はこちら。

AM10:00を過ぎるとEventBridge Scheduleによって、Amazon EC2 StartInstancesが実行され、起動しました。

PM18:00前の状態はこちら。

PM18:00を過ぎるとEventBridge Scheduleによって、Amazon EC2 StopInstancesが実行され、停止しました。

備考

IAMロールの設定において、EC2インスタンスの起動、停止のポリシーが必要かと思っていましたが、動作検証の結果、不要だということが分かりました。
→ EC2インスタンスで明示的なポリシー付与が不要なのは、AmazonSSMAutomationRoleにec2:StartInstancesとec2:StopInstancesが含まれるためだということが分かりました。

おまけ(Amazon Auroraのスケジュール起動/停止設定)

Amazon Auroraでも同じ設定を確認しましたので、Amazon EventBridge ScheduleでAmazon Auroraをスケジュール起動/停止する際の注意点を記載したいと思います。

IAMロール(インラインポリシー)の設定について

上記の備考欄にも記載していますが、EC2インスタンスの場合には、EC2インスタンスの起動、停止のポリシーは不要だったのですが、Amazon Auroraでは、以下のエラーが出てしまいました。

このため、RDSの起動、停止のポリシーを設定する必要があります。

  1. 作成したロールを開き、[許可を追加] > [インラインポリシーを作成]をクリックします。
  2. 以下のJSONコードを設定し、[ポリシーの確認]をクリックします。
  3. ポリシー名に任意の名前を入力後、[ポリシーの作成]を選択し、インラインポリシーを作成します。

APIの選択について

RDSでは、起動にStartDBClusterとStartDBInstanceというAPIが、また停止にStopDBClusterとStopDBInstanceというAPIが準備されています。 Amazon Aurora クラスターの停止と開始は、クラスターを使用するたびに、すべての DB インスタンスを設定および解放するのではなく、クラスターですべての DB インスタンスを一時的に停止することができます。(AWS公式サイトより

このため、起動には「StartDBCluster」、停止には「StopDBCluster」を選択することで、クラスターおよびインスタンスを起動、または停止することができます。
→ API設定時のJSONコードについては、インスタンスIDではなく、クラスターのARNを入力します。

いかがでしたでしょうか。
たまにしか環境にアクセスしない方にこそ試していただきたい設定内容ですので、ぜひマスターしてみてください。