EventBridge Scheduler 触ってみる
例によって参考にするクラメソさんの記事は既にある
GUIから適当にポチる
スケジュール名や時間やらの入力は適当に進む。
oneshotスケジュールにはタイムゾーンが設定できる。
定期タスクには...適当に入力するとJSTで認識されたっぽいのだけど、そのタイムゾーンを設定する手段がわからない。
次の10回のトリガー日は Date and time are displayed in your current time zone in UTC
とのことなのでcurrentになるのはわかるけど、入力自体のタイムゾーンどうすんだろ。コンソールからは変更できないのかな。できなくていいけど。
あと非常に地味なのだけど、cron式の "日付" 枠を入力すると、曜日が自動で ?
が補完される。
日付や月は全部 *
なのに曜日だけ ?
という人類の罠が自動回避されている。
あと、定期実行の場合は「時間枠」ってのがある。雰囲気的には、指定した期間の間だけcron(やrate)を有効化、みたいな感じなのかな。
ユースケースはちょっとわからない。年末年始だけ止めるみたいなのを考えたけど、再有効化とかないし別の手段でルール自体のenableをいじったらいいような気がするし。
ちなみにawscliから確認すると、cron式と一緒にタイムゾーン情報が入ってた。
"ScheduleExpression": "cron(30 18 * * ? *)",
"ScheduleExpressionTimezone": "Asia/Tokyo",
※コンソール上でも 30 18
って入れた
なおコマンドはこんな感じ: aws scheduler get-schedule --name scheduler-test
ターゲットの選択画面に進むと、選ぶところに「頻繁に使用されるAPI」と「すべてのAPI」とグループが選べる。
いまテストしているAWSアカウントは先日ゴミリソースを断捨離してしまったため、lambda関数すらない。
lambda関数作るのが面倒なので、適当にcloudwatch logsのイベント追加でいいか。ということで、「すべてのAPI」からCloudwatch LogsのPutLogEventsを選ぶ。
画面下にデータのjsonがあるので、それっぽく入れる。
スケジュール自体のenableの設定(これ最初じゃなくてここにあるんだ?)や再試行ポリシーの設定があるが、テストなので適当に済ませる。
で、最後にアクセス許可なのだけど...
「このスケジュールの新しいロールを作成」が選べない。んで正直なんの権限を渡せばいいかはよくわからない。
適当にadminアクセスのロールを渡してみたところ
The execution role you provide must allow AWS EventBridge Scheduler to assume the role.
あーまぁ人間が使う用だからな。EventBridgeにassumeする設定にはなってないわ。
というわけで必要な権限がパッとわからないので、大人しくlambdaを作る。
「頻繁に使用されるAPI」ならきっとテンプレロールが作成されるであろう。
詳細は省くが、適当にlambdaを作ってそれで進めたら難なく完了した。IAMロールも作ってもらったし、ちゃんと時間に発火したし。
ちなみに生成されたRoleは、許可ポリシーが
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:xxxxxx:function:scheduler-test:*",
"arn:aws:lambda:ap-northeast-1:xxxxxx:function:scheduler-test"
]
}
]
}
で、信頼されたエンティティが
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceArn": "arn:aws:scheduler:ap-northeast-1:xxxxxx:schedule/test/scheduler-test",
"aws:SourceAccount": "xxxxxxxx"
}
}
}
]
}
※アカウントIDは見せてもいいらしいと聞いたことはあるが、一応伏せた。で↑の2つのjsonの中では全て同じ値。
となっていた。なるほど
ところでスケジュール作成時に「スケジュールグループ」という概念があった。
グループは作ってみたが、正直タグぐらいしか設定できる要素が無い。本当にグルーピングするだけのものなのだろう。
ちなみにスケジュール自体のARNは arn:aws:scheduler:ap-northeast-1:xxxxxx:schedule/default/scheduler-test
という感じだった。defaultはグループ名で、namespacedな感じになっており、グループをまたいで同じ名前のスケジュールを作成することは可能のようだ(てか実際似できた)。
スケジュールのターゲットはとてもたくさんの(任意の?)AWS API callを設定できそうなので、割と色々活用できそう。
たとえばECSのUpdateServiceが呼べるので、曜日や時間帯によってサービスのdesired countを減らすとか簡単にできそう。
てか、似たことを試してる人が既にいた。まぁそうだよな。
これら、以前までのEventBridgeのルールでもlambdaを仲介すればできたが、仲介物いれたくないよね。やっぱり。
あ、そういえばterraformの対応リクエストのissue貼っておきますね。
このサービスの立ち位置としては、従来のEventBridgeルール(旧Cloudwatch Events)から時間駆動なイベントだけを新版として切り出したような感じなのかな。
awscliのコマンドも events
配下ではなく scheduler
と新しくnamespace切られてたし、「ちゃんと切り出した」の思いを感じる。
ざっと調べた感じ、少なくとも時間駆動イベントについては(知見溜まってないとかterraform対応してないとかを除けば)積極的に旧版を使う理由はない(新版にデメリットがない)ように見える。
※ありそうだったら教えてください。
将来的には時間駆動系は全部これでやるのかなー。