☀️

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の開発環境については下記の記事が大変参考になります。
https://zenn.dev/os1ma/articles/935f6e653f1052

こちらの記事でも紹介されているように、uvは単一のツールで「Pythonのバージョン指定」「仮想環境の作成・管理」「パッケージ管理」を完結させることができます。

そして、uvの最大の特長は、Rust製であることによる圧倒的なパフォーマンスです。依存関係の解決やパッケージのインストールが非常に高速で、開発サイクルを快適にします。

環境構築手順

uvの導入

いくつか方法があるので、公式ドキュメントを参照してください。
https://docs.astral.sh/uv/getting-started/installation/

プロジェクトの作成

uv initを実行すると、プロジェクトが初期化されます。デプロイ時に使用するPythonバージョン(この例では~=3.12.0、つまり3.12.0以上3.13.0未満)を-pオプションで指定するとよいでしょう。

uv init -p ~=3.12.0 hello-world

コード作成

今回はサンプルとして、main.pyの内容を下記のとおり置き換えます。

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が生成されます。

詳しくはこちらのドキュメントが参考になります。
https://docs.astral.sh/uv/concepts/projects/dependencies/#removing-dependencies

ローカルでの実行

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の管理外にします。

.gitignore
# 既存ファイルに追記
requirements.txt

こちらの記事を参考にさせていただきました。
https://withlogic.co/var/log/2025/01/20/setting-up-uv-with-google-cloud-run-functions

デプロイ

ここまでで環境構築については完了していますが、参考までにgcloud CLIを使用したデプロイ方法についても簡単に記載します。

先にgcloud CLIをインストールしておきます。
https://cloud.google.com/sdk/docs/install?hl=ja

下記はデプロイの実行例です。デプロイコマンドの--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に対してリクエストすれば、動作確認することができます。

参考資料

https://cloud.google.com/functions/docs/create-deploy-http-python?hl=ja
https://github.com/GoogleCloudPlatform/functions-framework-python
https://docs.astral.sh/uv/guides/projects/

おわりに

本記事では、uvを使ってCloud Run FunctionsのPython開発環境を構築し、ローカルでテスト、そしてデプロイするまでの一連の流れを解説しました。

uvを導入することで、高速なパッケージ操作と、効率的な環境構築が実現でき、開発体験を大きく向上させることができます。

現状ではrequirements.txtの出力という一手間が必要ではありますが、それを上回るメリットがあるケースも多いのではないでしょうか。

レスキューナウテックブログ

Discussion