Prefect(Python)とは?ワークフロー管理の使い方と3系の始め方

Prefectは、Pythonの関数を@flow@taskで囲むだけでデータパイプラインを構築・監視できるワークフローオーケストレーションツールです(英単語の prefect=監督生・長官の意味ではなく、開発元 Prefect Technologies が提供するOSSツールを指します)。2024年9月にメジャー更新の3.0がGAとなり、本稿執筆時点の最新は3.7.8です。この記事では、Prefectの基本概念、pip導入とDocker Composeでの環境構築、FlowとTaskの書き方、デプロイとWork Pool、スケジューリング、キャッシュによる冪等性、AirflowやDagsterとの使い分けまで、最新の3系にそろえて解説します。

まとめ:Prefectの要点と最短の始め方

  • 正体:Pythonネイティブのワークフローオーケストレーションツール。既存のPython関数にデコレータを付けるだけでフロー化でき、実行状況をUIで可視化・リトライ・スケジュール実行できる。
  • 3系の要点:イベント駆動オートメーションがOSSに開放、トランザクションAPIで冪等性を確保、実行基盤はエージェント廃止でWork Pool+Workerへ統一、実行エンジン刷新で高速化。
  • 最短の始め方pip install prefect → 関数に@task/@flowpython flow.py で実行。UIはprefect server starthttp://127.0.0.1:4200
  • 使いどころ:Pythonで動的にパイプラインを書きたいチーム向き。静的DAGの大規模バッチを既にAirflowで回しているなら無理に移行しない、長時間の分散ステートフル処理はTemporalが候補、という線引きで選ぶ。

Prefectとは|Pythonで書くワークフローオーケストレーションツール

Prefectは、複数の処理(データ抽出→変換→ロード、モデル学習、バッチ集計など)を「いつ・どの順で・失敗したらどうするか」を含めて管理する仕組みを、Pythonコードのまま与えます。ライセンスはApache 2.0のOSS本体に加え、マネージド版のPrefect Cloudがあり、同じコードをそのまま自前サーバーでもCloudでも動かせます。特別なDSLやYAMLでDAGを宣言する必要はなく、通常のPython関数にデコレータを付けるだけで、リトライ・キャッシュ・ログ・可視化が後付けで効きます。

まず押さえるべき構成要素は次の5つです。この語彙が分かると、以降のインストールやデプロイの説明が一直線に理解できます。

要素 役割
Task ワークフローの最小単位。@taskを付けた関数。リトライ・キャッシュの対象
Flow Taskを束ねる本体。@flowを付けた関数。実行の単位
Deployment Flowをスケジュール・API実行できる形に登録したもの
Work Pool Flowをどのインフラ(ローカル/Docker/K8s/ECS等)で動かすかの窓口
Worker Work Poolを監視し、実際にジョブを起動するプロセス(旧エージェントの後継)

同種のツールにApache AirflowやDagster、Temporalがあります。Airflowが静的なDAG定義と豊富な運用実績で強いのに対し、Prefectは「普通のPythonをそのままワークフロー化する」動的な書き味が特徴です。比較の詳細は本文後半のApache Airflowによるワークフロー管理との違いの章で扱います。

Prefect 3系の主な特徴と2系からの変更点

3.0は2.xからの単なる機能追加ではなく、実行エンジンとキャッシュ、実行基盤を作り替えたメジャー更新です。2系の記事やコードを見て学ぶ場合は、次の変更点を前提に読み替えてください。

観点 Prefect 2.x Prefect 3.x
イベント/オートメーション Cloud限定 OSSにも開放
キャッシュ/冪等性 個別キャッシュ トランザクションAPIで統一
実行基盤 Agent+Work Queue Worker+Work Pool(Agent廃止)
実行モデル スレッド分散 既定でメインスレッド実行
型/検証 Pydantic v1 Pydantic v2

最大の変更は、これまでPrefect Cloud専用だったイベント&オートメーション基盤がOSS本体に入ったことです。フローの完了や外部イベントをトリガーに別のフローを起動する、といった自動化を無料のOSSだけで組めます。

もう一つの核がトランザクションAPIです。複数のTaskを1つのトランザクションにまとめ、途中で失敗したら副作用(書き込み済みファイルの削除など)をロールバックできます。これによりキャッシュも「トランザクションがコミットされた時だけ結果を確定する」方式に刷新され、再実行時の冪等性が扱いやすくなりました。

実行基盤ではエージェントが廃止され、Work Pool+Workerに一本化されました。2系でagentを使っていた場合、3系ではWorkerへの置き換えが必要です。あわせて、既定でコードがメインスレッド上を走るようになり、共有リソースやスレッドセーフでない処理での挙動が直感的になったうえ、実行エンジンの刷新で大規模フローの処理性能が改善しています。

Prefect 3系のインストールと環境構築

導入はPythonパッケージ1つで完結します。ローカルで試す→Docker Composeで永続化する→Cloudに載せる、の順で環境を広げていくと迷いません。

pipでのインストールとバージョン確認

Python 3.10以上の環境で次を実行します(最新3.7系はPython 3.10以上が必要)。仮想環境(venvやuv)を切ってから入れるのが安全です。

pip install prefect
prefect version

prefect versionで3.7.x系が表示されればOKです。2系が入っている環境をアップグレードする場合は、上のトランザクション表の変更点(特にエージェント廃止)を確認してから上げてください。

ローカルサーバー(UI)の起動と接続

手元でダッシュボードを立ち上げるにはサーバーを起動します。

prefect server start

起動後、ブラウザでhttp://127.0.0.1:4200を開くとUIが表示され、フローの実行履歴やログ、Work Poolの状態を確認できます。フロー実行時にこのローカルAPIへ接続させたい場合は、別ターミナルでprefect config set PREFECT_API_URL=http://127.0.0.1:4200/apiを設定します。

Docker Composeで永続構成を作る

prefect server start単体はSQLiteの一時構成で、プロセスを止めると実行履歴が扱いにくくなります。チームで使うなら、PostgreSQLをバックエンドにしたサーバーをDocker Composeで永続化するのが実務的です。Prefectサーバーは環境変数PREFECT_API_DATABASE_CONNECTION_URLにPostgreSQLの接続文字列を渡すだけでDBを切り替えられます。

services:
  database:
    image: postgres:16
    environment:
      POSTGRES_USER: prefect
      POSTGRES_PASSWORD: prefect
      POSTGRES_DB: prefect
    volumes:
      - db:/var/lib/postgresql/data
  server:
    image: prefecthq/prefect:3-latest
    command: prefect server start --host 0.0.0.0
    environment:
      PREFECT_API_DATABASE_CONNECTION_URL: postgresql+asyncpg://prefect:prefect@database:5432/prefect
    ports:
      - "4200:4200"
    depends_on:
      - database
volumes:
  db:

Docker Compose自体の書き方(サービス定義やボリューム管理)に不安があれば、docker-composeで複数コンテナを一括管理する仕組みを先に押さえておくと、この構成の意味が理解しやすくなります。

Prefect Cloudを使う場合(OSSとの違い)

サーバー運用を自前で抱えたくない場合はPrefect Cloudを使います。CLIからログインしてワークスペースに接続すれば、フローの実行結果が自動でCloud側に集約されます。

prefect cloud login

OSSとCloudでフローのコードは同一で、違いは「オーケストレーション面(履歴保存・イベント基盤・権限管理・SLA監視)を誰が運用するか」です。Cloudには無料枠があり、まず個人利用で試してからチーム利用へ広げられます。料金や上限はプランで変わるため、採用前に公式の最新プランを確認してください。

FlowとTaskの最小実装

Prefectの学習コストが低い理由は、通常のPython関数にデコレータを足すだけでワークフロー化できる点にあります。次はTaskを1つ定義し、Flowから呼び出す最小例です。

from prefect import flow, task

@task
def add(x: int, y: int) -> int:
    return x + y

@flow(log_prints=True)
def my_flow():
    total = add(3, 5)
    print(f"3 + 5 = {total}")

if __name__ == "__main__":
    my_flow()

実行はスクリプトをそのまま走らせるだけです。

python flow.py

2系の解説記事に出てくるprefect runコマンドは3系では使いません。開発中はpython flow.pyで直接実行し、スケジュールやAPI経由の実行が必要になった段階で次章のデプロイに進む、という流れになります。@flow(log_prints=True)を付けるとprint出力がそのままフローのログとしてUIに残ります。

デプロイとWork Pool・Workerによる実行

スケジュール実行やAPIからのトリガー実行をするには、Flowを「デプロイ」して常時受け付けられる状態にします。3系での基本パターンは2通りです。

手軽なのは.serve()で、指定したFlowを常駐プロセスとして待機させ、スケジュールやUIからの実行を受け付けます。

if __name__ == "__main__":
    my_flow.serve(name="my-first-deploy", cron="0 9 * * *")

本番でインフラを分けたい場合は、Work PoolとWorkerを使います。Work Poolは「どこで実行するか」の窓口、WorkerはそのPoolを監視して実際にジョブを起動するプロセスです。

prefect work-pool create my-pool --type process
prefect worker start --pool my-pool

あとはFlowをflow.deploy()またはprefect deployで対象のWork Poolに紐付けて登録すれば、スケジュールやAPI実行のたびにWorkerがジョブを起動します。ローカル検証はprocessタイプ、本番はDockerやKubernetesなどのPoolタイプ、と実行基盤に合わせて選び分けます。

スケジューリングと自動化(Automation)

定期実行は、デプロイにスケジュールを付けるだけで有効になります。CronとIntervalの2方式があり、.serve()prefect deployの引数、またはUIから設定できます。

# 毎日9時に実行(Cron)
my_flow.serve(name="daily", cron="0 9 * * *")

# 1時間ごとに実行(Interval)
my_flow.serve(name="hourly", interval=3600)

時刻ベースの定期実行に加え、3系ではイベント駆動のAutomationがOSSで使えます。「あるフローが失敗したらSlackに通知する」「特定のイベントを受けたら別フローを起動する」といったルールを、UIまたはコードで定義できます。失敗時のリトライはTask/Flowの引数で指定します。

@task(retries=3, retry_delay_seconds=10)
def call_api():
    ...

このretriesとAutomationの通知を組み合わせると、「3回リトライしても失敗したら通知」という運用が定型化できます。通知チャネル(メール・Slack等)はブロック(Block)として登録して再利用します。

キャッシュとトランザクションによる冪等性の確保

同じ入力に対する再計算を避けたい、あるいは途中失敗した処理をきれいにやり直したい——こうした冪等性の要求に、3系はトランザクションとキャッシュポリシーで応えます。まずTaskのキャッシュはcache_policyで制御します。

from prefect import task
from prefect.cache_policies import INPUTS

@task(cache_policy=INPUTS)
def transform(data):
    ...

INPUTSを指定すると、同じ引数で呼ばれたTaskは前回結果を再利用してスキップします。さらに複数Taskをまとめて「全部成功したら確定、途中で失敗したら巻き戻す」制御をしたい場合はトランザクションを使います。

from prefect import flow
from prefect.transactions import transaction

@flow
def pipeline():
    with transaction():
        write_file()   # 失敗時はon_rollbackで削除
        load_db()

トランザクション内のTaskにon_rollbackフックを定義しておくと、後段のTaskがこけた時に前段の副作用(書き込んだファイルの削除など)を自動で取り消せます。バッチ処理の「途中まで書き込まれて中途半端な状態が残る」問題を、コードの構造として防げるのが3系の強みです。

クラウド・インフラ連携(Docker / Kubernetes / ECS / Cloud Run / GCP)

本番ではフローをコンテナやマネージド基盤で動かします。実行先はWork Poolのタイプで切り替えるだけで、Flowのコードは変えません。代表的なタイプは次の通りです。

Work Poolタイプ 実行先 向いている用途
process ローカルプロセス 開発・検証
docker Dockerコンテナ 環境固定・単一ホスト
kubernetes K8s Job 大規模・自動スケール
ecs AWS ECS/Fargate サーバーレスにAWSで実行
cloud-run Google Cloud Run サーバーレスにGCPで実行

KubernetesでのJob実行は、クラスタ側の権限やイメージ管理を含めた設計が要ります。前提となるK8sの挙動はKubernetes 1.34の新機能・変更点の解説を、AWSでのコンテナ実行はAWS ECSの仕組みと起動タイプおよびAWS Fargateの料金とEC2との違いをあわせて確認すると、どのWork Poolを選ぶかの判断が付きます。GCP連携はprefect-gcp、AWS連携はprefect-awsのように、統合パッケージを追加インストールして使います。

pip install prefect-gcp   # Cloud Run・Vertex AI 連携
pip install prefect-aws   # ECS・S3 連携

PrefectとAirflow・Dagsterの違いと、採用すべきでない場面

「結局どれを使うか」で迷うなら、書き味と運用モデルで割り切るのが早いです。主要ツールの性格を並べます。

ツール 書き方 強み
Prefect 通常のPython+デコレータ 動的・低学習コスト・OSSでイベント駆動
Airflow DAGを明示定義 実績・エコシステム・静的バッチの運用
Dagster アセット(データ資産)中心 データ品質・リネージ管理
Temporal 言語横断のワークフローSDK 長時間・分散のステートフル処理

Prefectを積極的に選ぶのは、Pythonチームが動的なパイプライン(実行時に分岐やループ数が変わる処理)を素早く書きたいときです。逆に、次のような場面ではPrefectを第一候補にしない方が無難です。

  • 既にAirflowで安定運用している静的な大規模バッチ:移行コストに見合うだけの利点が出にくい。まずAirflowのまま最適化する。Apache Airflowによるワークフロー管理で自社の運用と照らして判断する。
  • 数時間〜数日にわたる長時間・分散のステートフル処理:耐久性の高いワークフロー実行が本質ならTemporal Workflowの仕組みと比較が適する領域。
  • データ資産のリネージ・品質管理が主目的:アセット中心のDagsterの方がモデルに合う。

Prefectは「オーケストレーションを重装備で導入する」より「今あるPythonコードに信頼性を後付けする」方向に強いツールだ、と位置づけると選定を誤りません。

よくある質問(FAQ)

prefectは英単語の「監督生」とは別物ですか?

別物です。英単語の prefect は監督生・長官を指しますが、本稿のPrefectは Prefect Technologies が開発するPython製のワークフローオーケストレーションツールを指します。検索意図が辞書か製品かで結果が混在するため、ツールを探す場合は「prefect python」「prefect オーケストレーション」で絞ると精度が上がります。

Prefect Cloudは無料で使えますか?

無料枠があり、個人利用や小規模な検証はコストをかけずに始められます。OSS本体(Apache 2.0)はサーバーごと無料で自前運用でき、Cloudは履歴保存・イベント基盤・権限管理などのオーケストレーション面をマネージドで肩代わりします。上限や有料プランの条件は変動するため、採用前に公式の最新プランを確認してください。

Prefect 2から3への移行は必要ですか?互換性は?

2系は保守フェーズで、新機能や性能改善は3系が対象です。3系ではエージェントが廃止されWorkerへ移行が必要、キャッシュがトランザクション方式に、型検証がPydantic v2に変わっています。既存の2系フロー自体はデコレータの書き方が近く移行しやすい一方、実行基盤(agent→worker)とキャッシュ設定は書き換えが要ります。

PrefectのGUI(UI)はどこで確認しますか?

ローカルではprefect server startを実行しhttp://127.0.0.1:4200を開くとUIが表示されます。フローの実行履歴・状態・ログ、Work PoolやWorkerの稼働状況、スケジュールの管理をこの画面で行います。Prefect Cloudを使う場合はCloudのワークスペース画面が同じ役割を担います。

AirflowとPrefectはどちらを選ぶべきですか?

静的なDAGを明示定義して大規模バッチを堅く運用したいならAirflow、通常のPythonをそのまま動的にワークフロー化して素早く回したいならPrefectが向きます。既にAirflowで安定している場合は無理に乗り換えず、新規のPythonパイプラインからPrefectを試すのが現実的です。

関連記事

資料請求

RELATED POSTS 関連記事