LoginSignup
2
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のみで処理が完了するため、一番簡単に設定ができると感じた。今後新規に設定するのであれば、この方法がよいのではと思われる。
2
0
0

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
  3. You can use dark theme
What you can do with signing up
2
0