Cloud Functionsで使用中のライブラリバージョンを特定する方法
TL;DR
- Cloud Functionsにデプロイされたライブラリの正確なバージョンは、コンテナイメージを取得して内部を調査することで確認できる
- Artifact Registryから取得したコンテナイメージのファイルシステムを抽出し、.dist-infoディレクトリを調べることでバージョン情報がわかる
はじめに
Cloud Functionsをデプロイする際、requirements.txt
でライブラリのバージョンを指定することがあります。
しかし、ワイルドカード(*
)を使用してバージョンを指定している場合、実際にどのバージョンがデプロイされているか把握しづらくなります。
この記事では、すでにデプロイ済みのCloud Functionsで使用されているPythonライブラリの正確なバージョンを調査する方法を紹介します。
なぜバージョンを固定する必要があるか
以下のようなrequirements.txt
を使用してCloud Functionsをデプロイしているケースを考えます
functions-framework==3.*
google-auth==2.*
google-api-python-client==2.*
flask==2.*
google-auth-oauthlib
google-cloud-secret-manager
このように記述すると、メジャーバージョンが固定されるものの、マイナーバージョンやパッチバージョンは最新のものが自動的に使用されます。
また、一部のライブラリではバージョン指定がない場合もあります。
これには以下の問題があります
- デプロイのたびに異なるバージョンが使用される可能性がある
- ライブラリ間の互換性問題が発生する可能性がある
- 本番環境と開発環境で異なるバージョンが使われる可能性がある
そのため、現在デプロイされているライブラリの正確なバージョンを把握し、それをrequirements.txt
に明示的に記載することが望ましいです。
検証方法
Cloud Functions(第2世代)は、内部的にはコンテナイメージとしてデプロイされています。このイメージはArtifact Registryに保存されており、これを取得して内部を調査することでライブラリのバージョンを確認できます。
1. Artifact Registryの認証設定
まず、Artifact Registryへのアクセス権を取得するために認証を設定します
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
2. 関数名の確認
デプロイされているCloud Functionsの一覧を取得して、調査対象の関数名を確認します
gcloud functions list --project=${PROJECT_ID} --regions=asia-northeast1
実行結果
NAME STATE TRIGGER REGION ENVIRONMENT
my_service ACTIVE HTTP Trigger asia-northeast1 2nd gen
3. コンテナイメージの取得と展開
次に、コンテナイメージをダウンロードして内容を調査します。
動作させるのではなく、ファイルシステムの中身を抽出する方法を使います
# 一時コンテナを作成(実行はしない)
docker create --name temp_container --platform linux/amd64 asia-northeast1-docker.pkg.dev/${PROJECT_ID}/gcf-artifacts/${PROJECT_ID}__asia--northeast1__my_service:latest
# コンテナファイルシステムを特定のディレクトリに抽出
docker cp temp_container:/ ./container_files
# 一時コンテナを削除
docker rm temp_container
注意: ARM環境(M1/M2 Macなど)でAMD64のコンテナイメージを扱う場合は、--platform linux/amd64
オプションが必要です。
4. Pythonライブラリの情報を調査
コンテナ内のPythonライブラリ情報を取得するには、.dist-info
ディレクトリを検索します
find ./container_files -name "*.dist-info" | grep -E "functions_framework|google_auth|google_api|flask|google_cloud_secret_manager"
結果
実行結果は以下のようになりました
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_api_core-2.24.1.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/flask-2.3.3.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_auth_httplib2-0.2.0.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/functions_framework-3.8.2.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_auth_oauthlib-1.2.1.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_auth-2.38.0.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_cloud_secret_manager-2.23.0.dist-info
./container_files/layers/google.python.pip/pip/lib/python3.12/site-packages/google_api_python_client-2.161.0.dist-info
これで、各ライブラリの正確なバージョンが判明しました。
明示的なバージョン指定を含む新しいrequirements.txtの作成
調査結果に基づいて、新しいrequirements.txt
を作成します
functions-framework==3.8.2
google-auth==2.38.0
google-api-python-client==2.161.0
flask==2.3.3
google-auth-oauthlib==1.2.1
google-cloud-secret-manager==2.23.0
まとめ
- Cloud Functionsにデプロイされたライブラリの正確なバージョンは、コンテナイメージを調査することで確認できる
- 簡単に確認できないので作成時に明示的にバージョンを指定したほうがよい
Discussion