💎

prefect の deployment について理解する

2024/02/04に公開

はじめに

prefect の構成要素のうち、 deployment について理解します。
また説明の中で、関連要素である flow や task についても触れます。

前回は prefect の基本要素について触れました。
https://zenn.dev/massu_devix/articles/a016774865d647

deployment とは

deployment とは、 prefect に登録した flow を リモートで実行可能なエンティティ に昇華させるオブジェクトです。
flow とは prefect におけるワークフローとしての起動単位です。 flow を起動することで、その中で定義した処理が順に実行されます。 flow の中の処理を、 task として定義することも可能です。 task になった処理はリトライやキャッシュなどの機能が使えるようになるため、具体的なロジックを持つ処理は task として定義するのがいいでしょう。
flow をそのまま起動すると、prefect-server(正確には、バックエンドのDB)に flow が登録されますが、この状態では登録した flow を繰り返し起動することはできません。

そこで flow を deployment として登録することで、 deployment から flow の起動や停止、定期実行などのスケジューリングが自由に行えるようになります。これは、prefect-server の UI および API 両方から操作することが出来ます。

deployment の登録

実際に deployment を登録してみます。
比較のために、まず deployment を使わずに直接 flow を起動します。

以下の flow コードを用意します。

# sample_flow.py
from prefect import flow


@flow(log_prints=True)
def sample_flow():
    print("This is sample_flow.")


if __name__ == "__main__":
    sample_flow()

その後、スクリプトを実行します。

python sample_flow.py

以下のように flow が実行されたことが分かります。

INFO    | prefect.engine - Created flow run 'ancient-squirrel' for flow 'sample-flow'
INFO    | Flow run 'ancient-squirrel' - View at http://localhost:4200/flow-runs/flow-run/bf204754-93af-4533-b51b-9a965c9ad111
INFO    | Flow run 'ancient-squirrel' - This is sample_flow.
INFO    | Flow run 'ancient-squirrel' - Finished in state Completed()

UI 上でも確認できます。

現状、 flow を起動するためには毎回スクリプトを実行しなければいけません。

それではこの flow を deployment で prefect に登録してみます。

以下のようなコードを用意します。

# sample_deployment.py
import asyncio

from sample_flow import sample_flow


async def serve():
    await sample_flow.serve(name="sample-flow-deployment")


if __name__ == "__main__":
    asyncio.run(serve())

先ほど作成した sample_flow に対して serve() というメソッドを呼び出しています。
これにより、 flow を deployment として登録することが出来ます。

このスクリプトを実行します。

python sample_deployment.py

すると、以下のように flow をスケジューリング可能な状態になったメッセージが表示されます。

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ Your flow 'sample-flow' is being served and polling for scheduled runs!                                                                             │
│                                                                                                                                                     │
│ To trigger a run for this flow, use the following command:                                                                                          │
│                                                                                                                                                     │
│         $ prefect deployment run 'sample-flow/sample-flow-deployment'                                                                               │
│                                                                                                                                                     │
│ You can also run your flow via the Prefect UI: http://localhost:4200/deployments/deployment/85ec9fb5-8352-4af3-9bcb-b741ac3e40a4                    │
│                                                                                                                                                     │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

serve() を実行したプロセスは、そのまま prefect-server と polling 状態になるため、停止せずに起動し続けます。

別のターミナルで、以下のコマンドを実行すると、 deployment から flow を起動することが出来ます。

prefect deployment run 'sample-flow/sample-flow-deployment'

CLI とは別に、 UI 上でも flow を起動することが可能です。
UI 上の「Deployments」を開くと、登録した deployment が確認できるので、右側の Quick run を押して flow を起動します。

これで deployment から自由に flow を起動できるようになりました。

終わりに

今回は、 prefect の deployment を扱いました。
deployment の関連要素として、 work-pool や worker といった要素もあります。
こういった要素も、いずれ扱ってみたいと思います。

参考

https://docs.prefect.io/latest/tutorial/deployments/
https://docs.prefect.io/latest/concepts/deployments/

Discussion