Closed11

EventBridge Scheduler 触ってみる

inomotoinomoto

GUIから適当にポチる

inomotoinomoto

スケジュール名や時間やらの入力は適当に進む。

oneshotスケジュールにはタイムゾーンが設定できる。
定期タスクには...適当に入力するとJSTで認識されたっぽいのだけど、そのタイムゾーンを設定する手段がわからない。
次の10回のトリガー日は Date and time are displayed in your current time zone in UTC とのことなのでcurrentになるのはわかるけど、入力自体のタイムゾーンどうすんだろ。コンソールからは変更できないのかな。できなくていいけど。

あと非常に地味なのだけど、cron式の "日付" 枠を入力すると、曜日が自動で ? が補完される。
日付や月は全部 * なのに曜日だけ ? という人類の罠が自動回避されている。

あと、定期実行の場合は「時間枠」ってのがある。雰囲気的には、指定した期間の間だけcron(やrate)を有効化、みたいな感じなのかな。

ユースケースはちょっとわからない。年末年始だけ止めるみたいなのを考えたけど、再有効化とかないし別の手段でルール自体のenableをいじったらいいような気がするし。

inomotoinomoto

ちなみにawscliから確認すると、cron式と一緒にタイムゾーン情報が入ってた。

    "ScheduleExpression": "cron(30 18 * * ? *)",
    "ScheduleExpressionTimezone": "Asia/Tokyo",

※コンソール上でも 30 18 って入れた

なおコマンドはこんな感じ: aws scheduler get-schedule --name scheduler-test

inomotoinomoto

ターゲットの選択画面に進むと、選ぶところに「頻繁に使用されるAPI」と「すべてのAPI」とグループが選べる。

いまテストしているAWSアカウントは先日ゴミリソースを断捨離してしまったため、lambda関数すらない。
lambda関数作るのが面倒なので、適当にcloudwatch logsのイベント追加でいいか。ということで、「すべてのAPI」からCloudwatch LogsのPutLogEventsを選ぶ。
画面下にデータのjsonがあるので、それっぽく入れる。

inomotoinomoto

スケジュール自体のenableの設定(これ最初じゃなくてここにあるんだ?)や再試行ポリシーの設定があるが、テストなので適当に済ませる。

で、最後にアクセス許可なのだけど...

「このスケジュールの新しいロールを作成」が選べない。んで正直なんの権限を渡せばいいかはよくわからない。

適当にadminアクセスのロールを渡してみたところ

The execution role you provide must allow AWS EventBridge Scheduler to assume the role.

あーまぁ人間が使う用だからな。EventBridgeにassumeする設定にはなってないわ。
というわけで必要な権限がパッとわからないので、大人しくlambdaを作る。
「頻繁に使用されるAPI」ならきっとテンプレロールが作成されるであろう。

inomotoinomoto

詳細は省くが、適当に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の中では全て同じ値。

となっていた。なるほど

inomotoinomoto

ところでスケジュール作成時に「スケジュールグループ」という概念があった。
グループは作ってみたが、正直タグぐらいしか設定できる要素が無い。本当にグルーピングするだけのものなのだろう。

ちなみにスケジュール自体のARNは arn:aws:scheduler:ap-northeast-1:xxxxxx:schedule/default/scheduler-test という感じだった。defaultはグループ名で、namespacedな感じになっており、グループをまたいで同じ名前のスケジュールを作成することは可能のようだ(てか実際似できた)。

inomotoinomoto

スケジュールのターゲットはとてもたくさんの(任意の?)AWS API callを設定できそうなので、割と色々活用できそう。

たとえばECSのUpdateServiceが呼べるので、曜日や時間帯によってサービスのdesired countを減らすとか簡単にできそう。
てか、似たことを試してる人が既にいた。まぁそうだよな。
https://zenn.dev/y_suzaki/articles/90de5aff6d9167

これら、以前までのEventBridgeのルールでもlambdaを仲介すればできたが、仲介物いれたくないよね。やっぱり。

inomotoinomoto

このサービスの立ち位置としては、従来のEventBridgeルール(旧Cloudwatch Events)から時間駆動なイベントだけを新版として切り出したような感じなのかな。
awscliのコマンドも events 配下ではなく scheduler と新しくnamespace切られてたし、「ちゃんと切り出した」の思いを感じる。

ざっと調べた感じ、少なくとも時間駆動イベントについては(知見溜まってないとかterraform対応してないとかを除けば)積極的に旧版を使う理由はない(新版にデメリットがない)ように見える。
※ありそうだったら教えてください。

将来的には時間駆動系は全部これでやるのかなー。

このスクラップは2022/11/23にクローズされました