📚

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

このように記述すると、メジャーバージョンが固定されるものの、マイナーバージョンやパッチバージョンは最新のものが自動的に使用されます。
また、一部のライブラリではバージョン指定がない場合もあります。

これには以下の問題があります

  1. デプロイのたびに異なるバージョンが使用される可能性がある
  2. ライブラリ間の互換性問題が発生する可能性がある
  3. 本番環境と開発環境で異なるバージョンが使われる可能性がある

そのため、現在デプロイされているライブラリの正確なバージョンを把握し、それを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

まとめ

  1. Cloud Functionsにデプロイされたライブラリの正確なバージョンは、コンテナイメージを調査することで確認できる
  2. 簡単に確認できないので作成時に明示的にバージョンを指定したほうがよい

Discussion