cron 式というものを使ってAmazon EventBridge で
毎月最初の平日に実行するルールを指定する方法のメモです
具体的にはこれによって
商用環境は毎日起動しているが、テスト環境は土日起動していないので
月初が土日のときにテスト環境で失敗してしまう、というのを防げるはずです
結論
cron(0 1 1W * ? *)
詳細
1. そもそも Amazon EventBridge とは何か
ものすごくざっくりいうと
- イベントが発生し、
- そのイベントが定義したルールと一致する場合、
- ターゲット に Amazon EventBridge イベントを送信する
今回だと
- イベント:日時
- ルール:cron 式
- ターゲット:任意
という感じです
2. cron 式とはなにか
そもそも cron とは:
- Unix系オペレーティングシステムのジョブ管理ツール
- 指定した日時または間隔でジョブを実行する
この日時を指定するのに使うのが cron 式1
ひとことでcron式といっても、サービスごとに方言があるようです
例:
- 使用する文字数が違う
- 使用できる文字が違う
- 指定方法が違う(曜日が
0-6
なのか1-7
なのか など)
Amazon EventBridge の cron 式
* * * * * *
- - - - - -
| | | | | |
| | | | | +----- 年 (1970-2199)
| | | | +----------- 曜日 (1 - 7 または SUN-SAT)
| | | +----------------- 月 (1 - 12 または JAN-DEC)
| | +----------------------- 日 (1 - 31)
| +----------------------------- 時間 (0 - 23)
+----------------------------------- 分 (0 - 59)
cron 式の書き方はこちらを参考にさせていただきました
- 6文字(6つのフィールド)が必須
- 数字と文字( SUN など)以外にワイルドカードが使用できる
(フィールドによって違う)
cron 式のワイルドカード( Amazon EventBridge )
詳細は上記のユーザーガイドを参照ください
-
-
:範囲を指定(使用できるフィールド:すべて) -
*
:そのフィールドのすべての値を指定(使用できるフィールド:すべて) -
?
:任意の値(使用できるフィールド:日・曜日) -
L
:最終日を指定(使用できるフィールド:日・曜日) -
W
:平日を指定(使用できるフィールド:日)
注意点
Amazon EventBridge において
cron 式で指定したスケジュールは UTC+0 として解釈される
つまり、日本時間( UTC+9 )で実行したい場合
cron 式のスケジュールを +9 して考える必要がある
(サマータイムとかどうなってるんでしょうね?)
結論の cron 式はどういう意味か
cron(0 1 1W * ? *)
左から順に
- 分 :0 → 0 分
- 時間: 1 → 1 時
- 日 : 1W → 月の 1 日目に最も近い平日
- 月 : * → 毎月( 1-12 )
- 曜日: ? → 任意の曜日
- 年 : * → 毎年( 1970-2199 )
なので、
「 1970 年から 2199 年の間、毎月一番最初の平日の午前 1 時」
日本時間に直して
「 1970 年から 2199 年の間、毎月一番最初の平日の午前 10 時」
というのがこの cron 式で定義されているルールになります
考えたもの
cron(0 16 L * SUN-FRI *)
曜日が先に評価されるなら、これでも行けるのでは?と考えた式
意味として期待したのは
「 1970 年から 2199 年の間、毎月一番最後の日、曜日は日曜から金曜、時間は午後 4 時」
→ 「 1970 年から 2199 年の間、毎月一番最初の日、曜日は月曜から金曜、時間は午前 1 時」
と評価されてくれること
結論:エラーになる
公式ページの制約事項にまさに引っかかる書き方でした
cron 式の日フィールドと曜日フィールドを同時に指定することはできません。一方のフィールドに値または * (アスタリスク) を指定する場合、もう一方のフィールドで ? (疑問符) を使用する必要があります。
- 曜日フィールドに SUN-FRI
- 日フィールドに L
はダメで、どちらかを ? にしないといけないようです
しかしどちらかを ? にしてしまうと、毎月月初というのが成り立たなくなるのでこれはダメな書き方です
-
wikipedia は cron で間隔を指定するといっていたが、cron式で指定する方法は探せなかった(Amazon EventBridge だと rate 式というものを使って間隔を指定できる) ↩