ちょっと話題の記事

[新機能] タイムゾーン指定でスケジュール起動できるAmazon EventBridge Schedulerがリリースされました

EventBridgeの新たなタスク起動方法としてAmazon EventBridge Schedulerが使えるようになりました!EventBridgeルールとの違いやAmazon EventBridge Schedulerの登場によってどんな嬉しいことがあるのかをお伝えします!
2022.11.11

お疲れさまです。とーちです。

Amazon EventBridge Scheduler という新機能が発表されました!

EventBridge は好きなサービスの一つなので見逃せないアップデートです。早速触ってみましたので、共有したいと思います。

EventBridge Scheduler かんたんまとめ

  • タイムゾーンを指定して 定期的または1回限りのタスクを実行することができる
  • 決められた時間に起動するだけでなく特定の時間枠のどこかで起動といったことも可能(RDS 等にあるメンテナンスウィンドウのイメージ)
  • 270 以上の AWS サービスをターゲットとしてサポート、EventBridge ルールでは直接呼び出せなかったものも呼び出せる
  • 既存の「EventBridge ルール」とは別物

EventBridge ルールとの違いについて

先程も記載した通り、EventBridge ルールとは別のサービスとなっており、いくつか機能差があるので、ユースケースによって使い分ける形になります。 機能差については AWS Blogにわかりやすくまとまっていたので、こちらの内容を翻訳しつつ引用します。

Amazon EventBridge Scheduler Amazon EventBridge rules
スケジュール数のクォータ アカウント毎に 100 万 1 アカウントあたり、1 リージョンで 300 ルールの制限
イベント呼び出しのスループット 1,000TPS 単位のスループットに対応可能 上記スケジュール数のクォータにより、1 分単位のスケジュールを 300 個までしか作成できないのでスループットは最大でも 5TPS
ターゲット AWS SDK ターゲットを使用した 270 以上のサービスと 6,000 以上の API アクション EventBridge でサポートされる 20 以上のターゲット
時刻表現とタイムゾーン at(), cron(), rate() すべてのタイムゾーンと DST(サマータイム) cron(), rate() タイムゾーンは UTC のみ、DST のサポートなし
1 回限りのスケジュール Yes No※1
タイム ウィンドウ スケジュール Yes No
イベントバスのサポート イベントバス不要 Default bus のみ
ルールのクォータ消費 消費しない、100 万スケジュールのソフトリミット 消費する、バスごとに 2,000 ルールから消費※2

※1 cron 方式で実質1回しか起動しないというルールを作ることは可能です
※2 Amazon EventBridge UserGuideではバス毎に 300 ルールと記載されているので、ここでいう 2,000 がどこのクォータのことを指すのか不明

EventBridge Scheduler の嬉しいところ

個人的に注目したい点は、クォータ数とタイムゾーンのサポートのところです。

EventBridge ルールの300ルールまでという数は EventBridge を活用しだすと意外と制限に達しそうになっていた方も少なくはないのではないでしょうか?EventBridge Scheduler では、アカウント毎に 100 万までスケジュールを作成できるので、今後は時間で起動させたい要件の場合は、積極的に EventBridge Scheduler を使用したほうが良いのではと思います。

また、タイムゾーンの指定が出来るようになったことで、 以下のブログでも記載のあるようなUTCに変換すると日跨ぎになってしまうようなスケジュールを書きやすくなりました。

上記ブログでは、月曜〜土曜日の 7:30〜24:00(日本時間)の間は 1 分毎に定期実行というスケジュールを実現するために以下のように3つルールを作っていますが、

//月曜から土曜の7:30〜7:59
cron(30-59 22 ? * SUN-FRI *)

//月曜から土曜の08:00〜08:59
cron(* 23 ? * SUN-FRI *)

//月曜から土曜の09:00〜23:59
cron(* 0-14 ? * MON-SAT *)

EventBridge Scheduler では以下のように上記に比べるとシンプルに記載できます。

//月曜から土曜の7:30〜7:59
cron(30-59 7 ? * MON-SAT *)

//月曜から土曜の08:00〜23:59
cron(* 8-23 ? * MON-SAT *)

EventBridge Scheduler でのターゲットへの入力について

上記の比較表に記載されていない事項として、ターゲットへの入力の指定方法が大きな違いとしてあります。
EventBridge ルールではターゲットへの入力として、「一致したイベント」や「入力トランスフォーマー」等の選択肢がありましたが、EventBridge Scheduler では指定した JSON オブジェクトを入力として渡す方法のみとなります。一見、選択肢が減ったように見えますが、JSON オブジェクトの中では、変数として以下のような要素を使用できるので、EventBridge ルールのスケジュール起動でターゲットへの入力として使えていた主な要素はサポートされていると思います。

  • aws.scheduler.schedule-arn:スケジュールの ARN。

  • aws.scheduler.scheduled-time:スケジュールがターゲットを呼び出すために指定した時刻 (例:2022-03-22T18:59:43Z)

  • aws.scheduler.execution-id:ターゲットの呼び出しを試行するたびに EventBridge スケジューラが割り当てる一意の ID

  • aws.scheduler.attempt-number:現在の呼び出しの試行回数を識別するカウンター

試してみた

実際に AWS マネージメントコンソールから設定をしてみました。

EventBridge 画面左のナビゲーションペインに「スケジューラ」という項目が追加されています。

「スケジュールを作成」ボタンを押すと作成画面に入ります。

スケジュール名やスケジュールグループを指定します。スケジュールグループの用途が最初はわからなかったのですが、どうやらCloudWatchメトリクスでスケジュールグループ毎に試行回数等がカウントされるようです。

スケジュールパターンの項目でフレックスタイムウィンドウを指定すると指定した時間枠内に起動するような形になります。今回は「15 分」を指定してみたので、14:30~14:45 までのどこかで動くはずです。

時間枠の項目でタイムゾーンの指定ができます。

ターゲットを選択します。今回はシンプルに Lambda をターゲットとします。

ちなみに Lambda のコードはこんな感じで受け取った入力を出力するだけのシンプルなものです。

import json

print('Loading function')


def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['schedule-arn'])
    print("value2 = " + event['scheduled-time'])
    print("value3 = " + event['execution-id'])
    print("value4 = " + event['attempt-number'])
    return event['attempt-number']  # Echo back the first key value

Lambda 関数の関数名やターゲットに渡す JSON オブジェクトの指定をします。

EventBridge ルールと同様にスケジュールの有効化・無効化が出来ます。
再試行ポリシー、デッドレターキューも EventBridge ルールとほぼ同じ設定項目です。

暗号化の項目では、ユーザが作成した AWS KMS 暗号化キーを使って暗号化することもできます。今回はデフォルト設定にしました。

最後に確認画面で確認して、問題なければスケジュールを作成します。

実際に Lambda が起動したのは、14:44 でした。JSON オブジェクトに含めた変数からの入力も問題なく Lambda で受け取れていることが確認できました。

CloudWatch メトリクスについて

ざっと見たところ、EventBridge Scheduler UserGuideには、 2022/11/11 現時点では EventBridge Scheduler 関連の CloudWatch メトリクスに関する記述が見当たらなかったのですが、検証した環境では以下のメトリクスが発行されているのを確認しました。

InvocationAttemptCount という名前からしてスケジュール起動を試行した回数ということかと思います。 私が確認した範囲では、アカウント全体での集計と ScheduleGroup 毎の集計しかなさそうだったので、監視を検討する際は注意が必要かもしれません。 UserGuide が更新されたら、追記しようと思います。

2022/11/21 追記:
EventBridge Scheduler UserGuideが更新され、CloudWatch メトリクスに関する記述が追加されていました。
Monitoring Amazon EventBridge Scheduler with Amazon CloudWatch - EventBridge Scheduler

まとめ

EventBridge Scheduler の紹介でした。
タイムゾーンを指定してスケジュール実行出来るようになったのは素晴らしいですね! 積極的に使っていきたいと思います。

以上、とーちでした。