uvでCloud Run Functionsの開発環境を構築する
はじめに
Google CloudのFaaS(Function as a Service)であるCloud Run Functionsは、手軽にサーバーレスアプリケーションを構築できる強力なサービスです。
PythonでCloud Run Functionsを開発する際、環境構築には様々なツールが利用できますが、本記事では近年注目を集めている高速なパッケージマネージャーuvを活用した、モダンな開発環境の構築手順を紹介します。
前提
- Google Cloudのプロジェクトを作成済みで、請求が有効になっていること
動作確認環境
- WSL2 Ubuntu (Windows 11)
- uv 0.7.15
- Google Cloud SDK 528.0.0
uvのメリット
Pythonの開発環境については下記の記事が大変参考になります。
こちらの記事でも紹介されているように、uvは単一のツールで「Pythonのバージョン指定」「仮想環境の作成・管理」「パッケージ管理」を完結させることができます。
そして、uvの最大の特長は、Rust製であることによる圧倒的なパフォーマンスです。依存関係の解決やパッケージのインストールが非常に高速で、開発サイクルを快適にします。
環境構築手順
uvの導入
いくつか方法があるので、公式ドキュメントを参照してください。
プロジェクトの作成
uv init
を実行すると、プロジェクトが初期化されます。デプロイ時に使用するPythonバージョン(この例では~=3.12.0、つまり3.12.0以上3.13.0未満)を-p
オプションで指定するとよいでしょう。
uv init -p ~=3.12.0 hello-world
コード作成
今回はサンプルとして、main.py
の内容を下記のとおり置き換えます。
import flask
import functions_framework
@functions_framework.http
def hello(request: flask.Request) -> flask.typing.ResponseReturnValue:
return "Hello world!"
依存関係の管理
まず、作成したプロジェクトディレクトリに移動します。
cd hello-world
次に、uv add
でライブラリを追加します。
uv add 'functions-framework==3.*'
pyproject.toml
のdependenciesが更新され、uv.lock
が生成されます。
詳しくはこちらのドキュメントが参考になります。
ローカルでの実行
uv run
を使用すると、プロジェクトの仮想環境内で関数を実行できます。このとき使用されるPythonのバージョンは、プロジェクト作成時に指定したものになります。
uv run functions-framework --target hello --debug
別のターミナルなどからHTTPリクエストすることで、関数の動作を検証できます。
curl localhost:8080
requirements.txtの作成
Cloud Run Functionsでは、デプロイ時にrequirements.txt
が必要になるため、uv.lock
から生成します。
uv export --format requirements-txt --locked -o requirements.txt
また、二重管理にならないよう、requirements.txt
をGitの管理外にします。
# 既存ファイルに追記
requirements.txt
こちらの記事を参考にさせていただきました。
デプロイ
ここまでで環境構築については完了していますが、参考までにgcloud CLIを使用したデプロイ方法についても簡単に記載します。
先にgcloud CLIをインストールしておきます。
下記はデプロイの実行例です。デプロイコマンドの--runtime
オプションには、uv init
で指定したPythonのメジャーバージョンとマイナーバージョンに合わせた値を指定します(例:Python 3.12系ならpython312)。
gcloud functions deploy python-http-function \
--gen2 \
--runtime=python312 \
--region=asia-northeast1 \
--source=. \
--entry-point=hello \
--trigger-http \
--allow-unauthenticated
コマンド実行時の出力で、Cloud Run FunctionsのURIが表示されるので、そのURIに対してリクエストすれば、動作確認することができます。
参考資料
おわりに
本記事では、uvを使ってCloud Run FunctionsのPython開発環境を構築し、ローカルでテスト、そしてデプロイするまでの一連の流れを解説しました。
uvを導入することで、高速なパッケージ操作と、効率的な環境構築が実現でき、開発体験を大きく向上させることができます。
現状ではrequirements.txt
の出力という一手間が必要ではありますが、それを上回るメリットがあるケースも多いのではないでしょうか。
Discussion