「DAGを書くために独自の概念を覚えるのが億劫」「Pythonの普通の関数で書ければいいのに」。Airflowでパイプラインを組んでいると、こうした不満が出てきます。Prefectは、ちょうどここに刺さるオーケストレーターです。Pythonの関数をデコレータで装飾するだけでワークフローになり、書き味は普通のPythonとほぼ変わりません。
2018年に登場した比較的新しいツールで、Airflowの「重さ」へのアンチテーゼとして広まりました。記述の素直さ、動的なワークフローの書きやすさ、シンプル運用に強みがあります。基本構造と運用を順に押さえます。
@flowと@task:Pythonデコレータで完結
from prefect import flow, task
@task
def extract():
return load_orders_from_source()
@task
def transform(data):
return data.dropna()
@task
def load(data):
save_to_warehouse(data)
@flow(name="daily_orders")
def daily_orders():
raw = extract()
clean = transform(raw)
load(clean)
if __name__ == "__main__":
daily_orders()
これだけで、リトライ・並列実行・状態管理がついた立派なワークフローになります。`@task`の戻り値が次のtaskに渡る流れは、普通のPythonの関数呼び出しと変わりません。学習コストが圧倒的に低いのがPrefectの最大の特徴です。
動的ワークフローが書きやすい
「処理するファイルの数が日によって変わる」「クエリ結果に応じて並列度を変えたい」のような動的なワークフローは、Airflowでは書きにくい領域です。Prefectなら、Pythonのforループや条件分岐で素直に書けます。
@flow
def process_files():
files = list_pending_files() # 動的に件数が変わる
results = []
for f in files:
# 各ファイルが並列taskとして実行される
results.append(process_one.submit(f))
summarize([r.result() for r in results])
`.submit()`を呼ぶと並列実行用のキューに入り、`.result()`で結果を取り出せます。Airflowの動的DAG生成より、はるかに直感的です。
Prefect CoreとPrefect Cloud
| Prefect Core(OSS) | Prefect Cloud | |
|---|---|---|
| 提供形態 | OSS(Pythonライブラリ) | SaaS(マネージドUI・スケジューラ) |
| 主機能 | @flow/@taskでローカル実行 | UI・スケジュール・通知・ログ集約 |
| 費用 | 無料 | 無料枠+有料プラン |
| 使い分け | ローカル開発・小規模 | 本番運用・チーム共有 |
Prefect Cloudは無料枠が用意されており、小規模の本番運用なら無料の範囲で十分使える。チーム規模が大きくなったら有料プランを検討する、という導入カーブが描きやすいのも魅力だ。
スケジュールとデプロイ
# prefect.yamlでデプロイ設定
deployments:
- name: daily-orders
entrypoint: flows/orders.py:daily_orders
schedules:
- cron: "0 2 * * *"
work_pool:
name: default-agent-pool
# デプロイと実行
prefect deploy
prefect agent start --pool default-agent-pool
Prefectは「Flow」と「Deployment」を分離する設計です。Flowはコード、Deploymentは「いつ・どこで動かすか」の設定。同じFlowを別環境(開発・本番)で違うDeploymentから呼ぶ、といった運用がしやすくなっています。
dbtとの統合
from prefect_dbt.cli import DbtCoreOperation
@flow
def run_dbt_pipeline():
DbtCoreOperation(
commands=["dbt run --select orders+"],
project_dir="/opt/dbt",
profiles_dir="/opt/dbt",
).run()
DbtCoreOperation(
commands=["dbt test --select orders+"],
project_dir="/opt/dbt",
profiles_dir="/opt/dbt",
).run()
`prefect-dbt`という公式統合パッケージで、dbtコマンドをFlow内から呼べます。AirflowのCosmosやDagsterのdbt_assetsほどモデル単位の細かい制御はありませんが、シンプルさで勝負するPrefectらしい統合です。dbtの基本はdbt実装ガイド、incremental設計はincremental models設計を参照してください。
向く・向かない場面
- 向く:Pythonで素直に書きたい、動的なワークフローが多い、小〜中規模で運用負担を抑えたい、Prefect Cloud無料枠で本番運用したい
- 向かない:エコシステム・求人重視(→Airflow)、データアセット中心で運用したい(→Dagster)、超大規模で複雑な依存・ガバナンス要件がある
運用上の注意点
- エコシステムが薄め:Operatorに相当する統合は揃いつつあるが、Airflowに比べると選択肢が少ない。要件によっては自分で書くことになる。
- バージョン変遷が大きかった:Prefect 1から2への変更は破壊的だった。安定した2系を使うこと、3系の方向性を追うこと。
- Workerとエージェント:実行を担う「Worker」「Agent」の概念があり、運用環境への配置を理解する必要がある。
- ガバナンス・監査機能:エンタープライズ要件はCloudで対応するが、Airflow+商用ほどの厚みはまだ。
まとめ
- Prefectは@flow/@taskでPythonコードに最も近い書き味のオーケストレーター。
- 動的なワークフロー(件数可変・条件分岐)が素直に書ける。
- Prefect Cloud無料枠で小規模本番運用も可能。
- dbt統合は公式パッケージで対応。シンプル志向の統合。
- エコシステムや大規模ガバナンス要件はAirflow/Dagsterに譲るが、小〜中規模では強い選択肢。
全体像はオーケストレーター選び方ガイド、隣接の選択肢はAirflow とは・Dagster とはにあります。Prefectの導入や運用設計の壁打ちは、DE-STKの初回相談(30分・無料)もご利用ください。
よくある質問(FAQ)
Q. Prefectは個人開発の小スクリプトにも使えますか?
A. 使える。`@flow`を1つ付けるだけで、リトライ・ログ・状態管理が手に入るので、cronで動かすシェルスクリプトより信頼性が上がる。Prefect Cloudの無料枠でログとUIも見られる。「ちゃんとしたcron」として使い始め、必要に応じて広げる、という入り方ができるのは他にない強みだ。
Q. AirflowからPrefectへ移行する価値はありますか?
A. 既存Airflowが回っているなら移行する強い理由はない。記述の素直さは魅力だが、Airflow資産の書き換えコストと、エコシステム差を考えると、新規プロジェクトでPrefectを選ぶ判断が現実的だ。Airflowの重さに不満があり、シンプルな運用に戻したい場合は、移行検討の余地がある。
Q. WorkerとAgentの違いは?
A. 旧Prefect 1系のAgentが、2系以降はWorkerに整理された。役割は「Cloudや自前サーバーが管理するキューを監視し、実行ジョブをローカル環境で動かす」プロセスだ。複数の実行環境(オンプレ・クラウドそれぞれ)にWorkerを置くことで、適切な場所で実行できる仕組みになっている。実行環境の設計が、Prefect運用の地味だが大事なポイントだ。
Q. Prefect Cloud有料プランは、何ができるようになる?
A. 無料枠の制限(Flow Run数、ユーザー数、保管期間)が拡張され、SSO・監査ログ・ロールベースのアクセス制御が使えるようになる。小規模個人なら無料で十分回り、チームの本格運用に入る段階で有料を検討する、という形が一般的だ。料金体系は変動するため、導入時に公式ドキュメントで最新を確認してほしい。