# Prefect Server の ECS への設置 ## docker-compose.yml で、prefect serverが起動できる - [PrefectHQ/server: The Prefect API and backend](https://github.com/PrefectHQ/server) - README.md の Installation のちの `prefect server start`を実行 - プロジェクトディレクトリに、`pip install prefect`をしている - これは `prefect`コマンドを実行できるようにしている - `docker` , `docker-compose`コマンドを実行できる環境である前提としている - `prefect server start`コマンドにより、実際には、`docker-compose up`が実行される - この時の`docker-compose.yml` はprefect(serverの方でないもの)のもの - https://github.com/PrefectHQ/prefect/blob/master/src/prefect/cli/docker-compose.yml - → uiも含めて起動を確認 - ↑ `PrefectHQ/server` のdocker-composeを実行するわけではない - > Note: for deploying Prefect Server, please use the prefect server start CLI command in Prefect Core 0.13.0+. - `PrefectHQ/server`リポジトリ上のDockerfileも、`PrefetcHQ/prefect`リポジトリのDockerfileと大差なく、`pip install prefect`をして、リポジトリのコードを `/server` ディレクトリにコピーしているだけ。`prefect server start`が実行できるわけでもない。 - `prefect server start`を `docker-compose up`コマンドで実行できるようにしたい - `prefect server start`が何をしているのか? - https://github.com/PrefectHQ/prefect/blob/300d718a1071a39cffc17e5a4934d8bb93aae74d/src/prefect/cli/server.py#L412 1. 引数により、環境変数および `docker-compose.yml`を編集する 2. `docker-compose up`の実行(連携サービスの起動) 3. Clientのインスタンス化 - cloudでないので、create_tenant()を実行 - 上記の`prefect server start`での挙動をdocker-composeだけで実行するようにする - 環境変数など、引数であたえている値のデフォルト値をdocker-compose.ymlに当てはめてみる - [Environment variables in Compose | Docker Documentation](https://docs.docker.com/compose/environment-variables/) - 作業コミット: - [eb59fe58](https://github.com/tomoya-sforzando/etude-prefect/commit/eb59fe5857afed22c347af6b883e6901d3030ba0) ![](https://i.imgur.com/ifFHKdK.jpg) - [712942df](https://github.com/tomoya-sforzando/etude-prefect/commit/712942df645fd80afd9400db0264a50430a04539) ![](https://i.imgur.com/IuY5Q4X.png) - [f47d151b](https://github.com/tomoya-sforzando/etude-prefect/commit/f47d151b1570a09e5c4d2957205f7932bb29ec94) ![](https://i.imgur.com/ksBuUcf.jpg) ![](https://i.imgur.com/PEvCTn7.png) - ↑の状態となるdocker-composeを起動した状態で、ローカルの`pip install prefect`されているディレクトリ(docker-composeを実行したDirでなくても良い) から、`prefect backend server && prefect server create-tenant --name kashimada-local --slug kashimada-local` をすると、WebUIも正常に稼働していると思われる状態になる ![](https://i.imgur.com/QDaQfff.png) ![](https://i.imgur.com/HkgQChK.jpg) - では、上記のClient, tenantはどうすれば良いか? - docker-composeにserviceとして、`image: prefectHQ/core` を使ったコンテナを立てて、そのコンテナから `prefect prefect server create-tenant` する作戦 - `prefect server create-tenant` コマンドの処理には、Pythonサブプロセスによる`docker-compose` は使用していないのでいけるはず。 - 作業コミット: - [56d38a04](https://github.com/tomoya-sforzando/etude-prefect/commit/56d38a0426056fe1467e4380c33f0ff9e1d64c0a) → `ConnectionRefusedError: [Errno 111] Connection refused` のエラーが出る ![](https://i.imgur.com/DtcU0ky.jpg) ### `PrefectHQ/prefect` のDockerイメージについて - このイメージは、ほぼ `pip install prefect` しているだけ - どう使うかは、`docker-compose.yml` で実行するタスク/フローのPythonコードをボリュームマウントして実行するなど。あまり意味ない感じがする。 ``` version: "3" services: pipeline: image: prefecthq/prefect volumes: - .:/opt/app working_dir: /opt/app command: python flow.py ``` ### `PrefectHQ/prefect` リポジトリ内、 `src/prefect/cli/docker-compose.yml` について こちらは、上記の `prefect server start` によって、Pythonの処理とともにサブプロセスから実行されることを想定した内容になっていて、そのまま実行しても、環境変数などが設定されていないため実行エラーになる ![](https://i.imgur.com/LxgIJq5.jpg) ## Prefect: ECSサービスとして、Prefect serverを常駐起動できるようにする