LoginSignup
0

【コスト削減】AWS EC2インスタンス 夜間休日自動停止方法 (3) Amazon EventBridge Scheduler

Posted at

1. はじめに

  • AWS環境のコスト削減に取り組んでいる。コスト削減の一番ベーシックな対策である、EC2インスタンスの夜間休日の自動停止方法について、いくつかやり方があるようなので、それぞれ試してみて、難易度やメリット・デメリットを比較する。
  • 本記事では2023/5時点で最新の方法と思われる、EventBridge Schedulerでの方法を確認する。

2. やったこと

  • 自動起動・停止対象とするインスタンスを1台用意する。
  • 以下のスケジュール設定により、夜間休日のインスタンス自動停止を実現する。
    • EventBridge Schedulerで、月~金の9:00に、インスタンスを起動する設定とする。
    • EventBridge Schedulerで、月~金の21:00に、インスタンスを停止する設定とする。

3. Amazon EventBridge Schedulerとは(自分の理解)

  • 2022/11頃リリースされた様子。(AWS公式: Amazon EventBridge で新しいスケジューラーの提供を開始)
  • 元々「EventBridge ルール」の設定において、「何らかの外部処理をスケジューリング設定して呼び出す仕組み」があった。
  • その仕組みは残りつつ、「EventBridge Scheduler」では、スケジューリング機能が強化され、EventBridgeの子サービスの一つとして昇格している感じ。
  • 「EventBridge Scheduler」では、まずスケジュールを設定し、次にやりたい処理を設定する。「やりたい処理」として、外部のLambdaやSSM Automation ドキュメントなどを呼び出す必要はなく、既定のAPI(出来合いの処理のセット)としてインスタンスの起動や停止が用意されている。

4. 構成図

ins34.png

  • EventBridge Schdulerは、専用のアイコン(カレンダーと時計みたいな絵のもの)も用意されている。

5. 手順

5.1 事前準備

  • 自動起動・停止の対象とするEC2インスタンスを作成する。このインスタンスのインスタンスIDを指定して自動起動・停止の操作を行う。

5.2 IAMロールの作成

  • EventBridge スケジューラに対し、EC2の操作(今回は停止・起動)を許可する権限を付与する必要があり、そのためのIAMロールを作成する。
  • IAM -> ロール -> ロールを作成 ->「信頼されたエンティティタイプを選択」にて、「カスタム信頼ポリシー」を選択し、以下のJSONを指定する。

ins31.png

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

このロールの作成時、最初から信頼されたエンティティを「EventBridge Scheduler」にしたいが、2023/5現在、その指定ができないので、今回は「カスタム信頼ポリシー」の画面から作成する。

  • 許可ポリシーとして、「AmazonEC2FullAccess」を選択する。(今回は検証のため適当だが、実際には必要な最小権限を付与)

ins32.png

  • ロール名(mksamba-EventScheduler-InstanceStartStopRole)を付けて、ロールを作成する。

ins33.png

5.3 EventBridge Schedulerでのスケジュール登録

  • インスタンス停止を行うスケジュールを作成する。
  • EventBridge スケジューラ > スケジュール > スケジュールを作成 を選択し、スケジュール名を「mksamba-schedule-instance-stop」とする。
  • 月~金の21:00PMに動作するよう、cron式を設定する。今回は「0 21 ? * MON-FRI *」で設定。動作スケジュールの設定は直接JSTで可能。

ins35.png
ins36.png

  • ターゲット(時間になったら実行するのは何か)として、「EC2」->「StopInstances」を選択し、パラメータとして対象のInstanceIdを入力する。

ins37.png

  • このスケジューラを実行するIAMロールを設定する。(先の手順で作成したロールを使用)

ins38.png
ins39.png

  • 同様に、インスタンス開始を行うスケジュール「schedule-instance-stop」を作成する(画面は省略)。開始は月~金の9:00AMとするため、CRON式は「0 9 ? * MON-FRI *」となる。また、実行するターゲットは「EC2」->「StartEC2Instance」となる。

4.4 停止・起動の動作確認

  • 検証用に、16:16に起動、16:20に停止するようにEventBridge Schedulerの時刻設定を変更する。

  • Cloudtrailのログは以下のようになる。イベントの詳細を開くと、EventBridge Schedulerから起動・停止されていることを確認可能。

ins40.png

イベントレコード(抜粋).json
{
    "eventVersion": "1.08",
    "eventTime": "2023-06-05T07:16:45Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "us-west-1",
    "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.20.67 Linux/5.10.179-166.674.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/11.0.19+8-LTS Java/11.0.19 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
}

5. 参考

6. 所感

  • 従来の方法(Lambda + EventBridgeなど)と比べて、本記事の方法はEventBridgeのみで処理が完了するため、一番簡単に設定ができると感じた。今後新規に設定するのであれば、この方法がよいのではと思われる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0