背景
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式の方が難なくこなせたりします。なので、どっちを使え!じゃなくて基本その場の最適解を熟考する必要があります。
