久し振りに EventBridge でルールを作ろうと思ったらスケジュールを選択すると "EventBridge Scheduler - A new AWS scheduling capability!" となっていて EventBridge Scheduler というものが追加された模様。なお、左下の[Create to new rule]ボタンから以前のルールで作成することも出来る。
スケジュールの作成
スケジュールの設定はルールのときと同じような感じだけどタイムゾーンが指定出来るようになった。ルールのときは平日を指定しようとすると起動と停止で曜日をずらしたりとかあったけどそれが不要になったのはありがたい。
また、「フレックスタイムウィンドウ」というものが追加され(?)ランダムな遅延を持たせてスケジュールの実行ができるようになったみたい。
フレックスタイムウィンドウを選択した場合、スケジューラは指定した時間枠内でスケジュールを呼び出します。例えば、15 分を選択した場合、スケジュールはスケジュールの開始時刻から 15 分以内に実行されます。
現在フレックスタイムウィンドウに設定できるのは下記の 6 種類。
- オフ
- 15 分
- 30 分
- 1 時間
- 2 時間
- 4 時間
続いてターゲットを選択する。EC2 関連は「すべての API」を選択して「Amazon EC2」の中に入っている。
今回は起動と停止を設定していくので「StartInstances」か「StopInstances」を選択する。
「入力」画面が開くので JSON でパラメーターを設定する。
今回は複数台のインスタンスを起動・停止させるため InstanceIds
にインスタンス ID を入れていく。
{ "InstanceIds": [ "i-00000000000000001", "i-00000000000000002" ] }
続いてスケジュールをすぐに有効にするかどうかなどの設定をしていく。この辺は特に変更せずロールの設定のみ変更する。現時点では新しい実行ロールの作成はできないようなので予めロールを作成しておく必要がある。
ロールの作成
Scheduler から EC2 を操作するためのロールを作成する。2022 年 11 月 19 日時点ではユースケースに「Scheduler」が出てこないため一旦「EC2」でロールを作成してあとで書き換える。
ロールを作成したら信頼関係を編集して ec2.amazonaws.com
を scheduler.amazonaws.com
に変更する。
scheduler-ec2-start-stop-instances
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "scheduler.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
(私はポリシーを無駄に作りたくない派なので)インラインポリシーで ec2:StartInstances
と ec2: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:EnterStandby
と autoscaling:ExitStandby
が必要。EC2 インスタンスを停止するときはスタンバイにしてから停止して、起動するときは EC2 インスタンスが起動してからスタンバイを解除する。
AutoScalingEnterExitStandby
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "autoscaling:EnterStandby", "autoscaling:ExitStandby" ], "Resource": [ "arn:aws:autoscaling:*:000000000000:autoScalingGroup:*:autoScalingGroupName/*" ] } ] }
設定内容の確認
作成したロールをセットしたらスケジュールの確認を行って作成する。
起動用と停止用のスケジュールを作成すれば OK。
実行履歴の確認
Systems Manager Automation を使用していたときは Automation の履歴で確認していたけど今回の EC2 の起動・停止は 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。