cronと月末
AirflowのDAGスケジュールにおいて、
- 1/31 0:00
- 2/28 0:00
- 3/31 0:00
- 4/30 0:00
- ...
- 12/31 0:00
のように毎月の月末に実行したい場合、標準のcron式だと設定がちょっと厄介です。
30日の月もあれば31日の月もありますし、2月にいたってはうるう年のことも考えなければなりません。
Airflowではcron式の日フィールドに L
が使える
幸いなことに、Airflowが使っているcronモジュール croniter はいくつかの非標準のcron式もサポートしています。
その中には L
があります。
Airflow(croniter)において L
は日フィールドにのみ使える特殊な文字で、指定すると その月の最後の日 を意味することになります。
したがって、
dag = DAG(
...
schedule_interval="0 0 L * *"
...
)
のように書けば毎月の月末に実行することができます。
おまけ: Airflowではcron式の曜日フィールドには #
が使える
完全なる余談ですが、他にサポートしている文字として、 #
があります。
Airflow(croniter)において #
は曜日フィールドにのみ使える特殊な文字です。
L
と違い #
単体ではなく曜日指定との組み合わせで使います。 曜日#n
のように指定すると その月の第n曜日 を意味することになります。
たとえば、毎月第4火曜日 0:00に実行するDAGの場合、
dag = DAG(
...
schedule_interval="0 0 * * 2#4"
...
)
のように書くことができます。