はじめに
AirflowをCloud Composer上で運用する場合、DAGのスケジュールを cron
形式で指定する機会がほとんどです。
慣れていないと、、、
cronの書き方が毎回あやふやになる
「0 9 * * *」って、何時に実行だっけ?
Cloud ComposerだとUTCで動くんだっけ?
こうした疑問やつまづき、誰もが一度は経験するはずです。
本記事では、Cloud Composer × cron をテーマに、Airflowのスケジューリングを完全に理解できるようまとめます。
DAGの基本的なcron構文
Airflowでは、DAG定義に以下のように schedule_interval
を指定します。
from airflow import DAG
from datetime import datetime
dag = DAG(
dag_id="sample_dag",
start_date=datetime(2024, 1, 1),
schedule_interval="0 9 * * *", # 毎日 9:00 に実行
)
cron構文の基本
分 時 日 月 曜日
例えば:
cron式 | 意味 |
---|---|
0 9 * * * |
毎日 午前9時(UTC) |
30 15 * * 1 |
毎週月曜 午後3時30分(UTC) |
0 */6 * * * |
6時間おき(0時, 6時, 12時, 18時) |
Cloud Composerとタイムゾーン
Cloud Composer/AirflowではcronがUTC基準で評価されます。
よくあるミス:
-
"0 9 * * *"
→ これは JSTの18:00 に実行されます! - JST(日本時間)で朝9時に動かしたいなら →
"0 0 * * *"
(UTCの0時=JSTの9時)
対応策①:UTCのまま書く(最も安定)
# 例:日本時間 9:00 に動かす
schedule_interval="0 0 * * *" # UTCで0時
対応策②:DAG側で明示的にタイムゾーン指定(Airflow 2.x)
from pendulum import timezone
dag = DAG(
dag_id="japan_dag",
start_date=datetime(2024, 1, 1, tzinfo=timezone("Asia/Tokyo")),
schedule_interval="0 9 * * *", # JST 9時に実行される
)
Cloud Composer 2.x では
pendulum
ベースのタイムゾーン指定が安定します。
よく使うcronパターン集(JST対応)
実行したい時間(JST) | cron式(UTC) |
---|---|
毎日 9:00 | 0 0 * * * |
毎日 23:00 | 0 14 * * * |
毎週月曜 8:00 | 0 23 * * 0 |
毎月1日 10:00 | 0 1 1 * * |
平日毎日18:00 | 0 9 * * 1-5 |
毎時30分 | 30 * * * * |
3時間ごと | 0 */3 * * * |
テスト時の注意点:start_dateとcatchup
dag = DAG(
dag_id="test_dag",
start_date=datetime(2024, 1, 1),
schedule_interval="0 0 * * *",
catchup=False # ← これが重要!
)
catchup=True
だと何が起こる?
- DAG登録時から現在までの過去全実行スケジュール分が実行されてしまう
- 初回テスト時は
catchup=False
を推奨!
Cloud Composerにおける注意点
✅ cron式はUTC前提で記述すること
✅ 必要に応じて start_date
に tzinfo
をつけること
✅ 開発中のDAGでは catchup=False
にする
✅ スケジュールの実行タイミングは**「終了時刻=そのスケジュール分のデータを処理する」という仕様**に注意!
おわりに
Airflow/Cloud ComposerでのDAG管理において、cronとタイムゾーンの理解は極めて重要です。
「日本時間で何時に動くんだっけ?」という疑問を、この記事で解消できれば幸いです。