背景
Amazon EventBridge が、アプリケーション、統合された SaaS アプリケーション、および AWS のサービスから生成されたイベントを使用して、イベント駆動型アプリケーションの大規模な構築をより簡単にする方法を学びます。
EventBridgeにおける定時実行タスクの実現方法として、cron
式とrate
式があります。Linuxお馴染みの人なら、cron
を難なく書けるでしょう。例えば、現在時刻18:30
(18時30分)から一時間一回実行してほしいタスクに対して、EventBridgeで以下のようなcron
式を使用します:
cron(30 * * * ? *) // 00:30, 01:30 ... 19:30, 20:00...で実行されます
rate
式ならさらに簡単です:
rate(1 hour) // 設定時刻から一時間一回実行されます
しかし、このように同じく「1時間おきに一回実行」のタスクをcron
とrate
で実現しようとすると、振る舞いが微妙に違います。
cron式とrate式の違い
EventBridgeで18:30
に上記のcron
式で設定しますと、一回目の実行は19:30
となります。それに対して、同時刻にrate
式で設定した場合、18:30
(設定時刻から約40秒経つので18:31
になる可能性も)ですぐ一回実行され、19:30
で二回目の実行になります。
なぜこういう違いが生まれるのでしょう。考えられるのが、cron
とrate
の思想の違いです。
「決められた時刻で実行」するのがcron
です。18:30
で設定した時点では、18:30
という実行すべき時刻がすでに過ぎましたので、すぐには実行されず、19:30
で一回目実行されます。
それに対して、rate
式が「決められた時間内で一回実行される」ことを保証します。この場合、設定した時刻と関係なく、「一時間一回」のレートが保証されていますが、EventBridgeの場合設定した直後に一回目の実行がなされるような仕様です。
このような仕様が望ましくない場合、工夫も可能です。rate
式を使いたいが設定後一回目の実行は不必要な場合、Timeframe
→Start date and time
が選択可能です。一時間一回実行の場合、開始時刻を設定時刻の一時間後に設置すれば、cron
式と近い時刻で一回目の実行がなされます。
最後に
気軽に扱えそうなrate
式ですが、EventBridgeにおいてこういった裏仕様もありますので要注意です。
表現力において、一般的に言うとcron
の方が高いです。例えば、曜日指定や毎月〇日指定みたいなのはrate
式じゃなかなかできません。が、「何分/時間/日おきに一回」的なタスクなら、rate
式の方が難なくこなせたりします。なので、どっちを使え!じゃなくて基本その場の最適解を熟考する必要があります。