Poetry で開発して Cloud Functions にデプロイする
requirements.txt を生成する方法をメモ
結論:以下のコマンドで生成する。
!poetry export -f requirements.txt --output src/requirements.txt --without-hashes
Cloud Functions では pip を使うので、Poetry で開発している場合は requirements.txt を生成する必要がある。
Python で記述された Cloud Functions の依存関係を指定するには、2 つの方法があります。1 つは pip パッケージ マネージャーの
requirements.txt
ファイルを使用する方法、もう 1 つは関数と一緒にローカル依存関係をパッケージ化する方法です。
試す
依存関係
Poetry で requests パッケージをインストールする。
コード
Python クイックスタート | Google Cloud Functions に関するドキュメント
このドキュメントのコードをほぼそのまま使う。import requests
を追加しておく。
ディレクトリ構造
.
├── poetry.lock
├── pyproject.toml
├── venv
│ └── ...
└── src
└── main.py
デプロイコマンド
gcloud functions deploy | Google Cloud CLI Documentation
gcloud functions deploy my_function \
--runtime=python39 \
--entry-point=hello_world \
--source=src \
--trigger-http \
--project=<Project名>
requirements.txt
がない状態でデプロイすると、当然 requests が見つからないのでエラーが返ってくる。
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code. This is likely due to a bug in the user code. Error message: Error: please examine your function logs to see the error cause: https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs. Additional troubleshooting documentation can be found at https://cloud.google.com/functions/docs/troubleshooting#logging. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.
requirements.txt
pip freeze
pip freeze > src/requirements.txt
以下のような形式でパッケージ名が列挙される。
requests @ file:///Users/noy72/Library/Caches/pypoetry/artifacts/ff/f3/bc/a6781f93c2f9488431db494169bb514a083a1d77f3c325a277d8699398/requests-2.27.1-py2.py3-none-any.whl
デプロイすると当然エラーが起こる。
ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: '/Users/noy72/Library/Caches/pypoetry/artifacts/71/9a/ba/a51b34ce9aacf9ac5dbb90d7c7335877522ee188189d9a521ee1a9c411/certifi-2021.10.8-py2.py3-none-any.whl'; Error ID: c84b3231
poetry export
Commands | Documentation | Poetry - Python dependency management and packaging made easy
poetry で requirements.txt を生成する。
poetry export -f requirements.txt --output src/requirements.txt
以下のような形式になる。
requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0") \
--hash=sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d \
--hash=sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61
デプロイすると == 使ってね、ハッシュはダメだよ
的なエラーが出るはず……と思ったらデプロイできた。なんで?
poetry export --without-hashes
Poetry で export したのにエラーが出る場合は --without-hashes
オプションを使う。
poetry export -f requirements.txt --output src/requirements.txt --without-hashes
以下のような形式になる。
requests==2.27.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.6.0")