mattintosh note

どこかのエンジニアモドキの備忘録

AWS EventBridge SchedulerでEC2インスタンスの定時起動・停止を設定する

久し振りに EventBridge でルールを作ろうと思ったらスケジュールを選択すると "EventBridge Scheduler - A new AWS scheduling capability!" となっていて EventBridge Scheduler というものが追加された模様。なお、左下の[Create to new rule]ボタンから以前のルールで作成することも出来る。

AWS - EventBridge Rule
AWS - EventBridge Rule

スケジュールの作成

スケジュールの設定はルールのときと同じような感じだけどタイムゾーンが指定出来るようになった。ルールのときは平日を指定しようとすると起動と停止で曜日をずらしたりとかあったけどそれが不要になったのはありがたい。

また、「フレックスタイムウィンドウ」というものが追加され(?)ランダムな遅延を持たせてスケジュールの実行ができるようになったみたい。

フレックスタイムウィンドウを選択した場合、スケジューラは指定した時間枠内でスケジュールを呼び出します。例えば、15 分を選択した場合、スケジュールはスケジュールの開始時刻から 15 分以内に実行されます。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

現在フレックスタイムウィンドウに設定できるのは下記の 6 種類。

  • オフ
  • 15 分
  • 30 分
  • 1 時間
  • 2 時間
  • 4 時間

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

続いてターゲットを選択する。EC2 関連は「すべての API」を選択して「Amazon EC2」の中に入っている。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

今回は起動と停止を設定していくので「StartInstances」か「StopInstances」を選択する。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

「入力」画面が開くので JSON でパラメーターを設定する。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

今回は複数台のインスタンスを起動・停止させるため InstanceIdsインスタンス ID を入れていく。

{
  "InstanceIds": [
    "i-00000000000000001",
    "i-00000000000000002"
  ]
}

続いてスケジュールをすぐに有効にするかどうかなどの設定をしていく。この辺は特に変更せずロールの設定のみ変更する。現時点では新しい実行ロールの作成はできないようなので予めロールを作成しておく必要がある。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

ロールの作成

Scheduler から EC2 を操作するためのロールを作成する。2022 年 11 月 19 日時点ではユースケースに「Scheduler」が出てこないため一旦「EC2」でロールを作成してあとで書き換える。

AWS - IAM
AWS - IAM

ロールを作成したら信頼関係を編集して ec2.amazonaws.comscheduler.amazonaws.com に変更する。

scheduler-ec2-start-stop-instances

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

(私はポリシーを無駄に作りたくない派なので)インラインポリシーで ec2:StartInstancesec2:StopInstances を追加する。

EC2StartStopInstances

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:000000000000:instance/*"
            ]
        }
    ]
}

Auto Scaling を使用している場合は EC2 インスタンスを停止してしまうと新しいインスタンスが起動してしまうので希望する容量を 0 にするか事前にスタンバイにする必要がある。スタンバイを利用する場合は autoscaling:EnterStandbyautoscaling:ExitStandby が必要。EC2 インスタンスを停止するときはスタンバイにしてから停止して、起動するときは EC2 インスタンスが起動してからスタンバイを解除する。

AutoScalingEnterExitStandby

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:EnterStandby",
                "autoscaling:ExitStandby"
            ],
            "Resource": [
                "arn:aws:autoscaling:*:000000000000:autoScalingGroup:*:autoScalingGroupName/*"
            ]
        }
    ]
}

設定内容の確認

作成したロールをセットしたらスケジュールの確認を行って作成する。

AWS - EventBridge Scheduler
AWS - EventBridge Scheduler

起動用と停止用のスケジュールを作成すれば OK。

実行履歴の確認

Systems Manager Automation を使用していたときは Automation の履歴で確認していたけど今回の EC2 の起動・停止は CloudTrail のイベント履歴で確認ができる。

AWS - CloudTrail
AWS - CloudTrail

Scheduler から Automation を実行するときの謎

最初は Scheduler で StartAutomationExecution で作成してみたんだけど実行 ID に不正な書式が使われて実行もされない削除もできないという状態になった。

2 validation errors detected: Value '0000000000000000' at 'automationExecutionId' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}.; Value '0000000000000000' at 'automationExecutionId' failed to satisfy constraint: Member must have length greater than or equal to 36.

AWS CLI でも書式不正になるため保留中のまま何もできない状態になってしまった。なんとかしてくれ AWS

AWS - Systems Manager Automation
AWS - Systems Manager Automation