「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・監査ログ・ロールベースのアクセス制御が使えるようになる。小規模個人なら無料で十分回り、チームの本格運用に入る段階で有料を検討する、という形が一般的だ。料金体系は変動するため、導入時に公式ドキュメントで最新を確認してほしい。