Python での依存関係を指定する

Python で記述された Cloud Functions の依存関係を指定するには、2 つの方法があります。1 つは pip パッケージ マネージャーの requirements.txt ファイルを使用する方法、もう 1 つは関数と一緒にローカル依存関係をパッケージ化する方法です。

現在、Pipfile / Pipfile.lock 標準を使用した依存関係の指定はサポートされていません。プロジェクトにこれらのファイルが含まれないようにする必要があります。

pip を使用して依存関係を指定する

Python における依存関係は pip で管理され、requirements.txt というメタデータ ファイルで表現されます。このファイルは、関数のコードを含む main.py ファイルと同じディレクトリに置く必要があります。

関数をデプロイまたは再デプロイすると、Cloud Functions は pip を使用して、requirements.txt ファイルに宣言されている最新バージョンの依存関係をダウンロードしてインストールします。requirements.txt ファイルには、パッケージごとに 1 行が含まれています。各行にはパッケージ名が含まれます。パッケージ名以外に、リクエストされたバージョンが含まれている場合もあります。詳細については、requirements.txt のリファレンスをご覧ください。

依存関係のバージョンの変更によってビルドが影響を受けないようにするには、依存関係パッケージを特定のバージョンに固定することを検討します。

requirements.txt ファイルの例を次に示します。

functions-framework
requests==2.20.0
numpy

Functions Framework は、すべての関数に必須の依存関係です。Cloud Functions は、関数の作成時にユーザーの代理でこの依存関係をインストールしますが、明確化のため明示的な依存関係として含めておくことをおすすめします。

関数がプライベート依存関係を利用している場合は、functions-framework をプライベート レジストリにミラーリングすることをおすすめします。ミラーリング対象の functions-framework を依存関係として関数に含めることで、公共のインターネットからパッケージがインストールされないようにします。

ローカル依存関係をパッケージ化する

依存関係を関数とまとめてパッケージ化してデプロイすることもできます。この方法は、pip パッケージ マネージャーで依存関係を利用できない場合や、Cloud Functions 環境のインターネット アクセスが制限されている場合に便利です。

たとえば、次のようなディレクトリ構造を使用するとします。

myfunction/
├── main.py
└── localpackage/
    ├── __init__.py
    └── script.py

この場合、次の import ステートメントを使用して、通常どおり localpackage からコードをインポートできます。

# Code in main.py
from localpackage import script

このアプローチでは、いずれの setup.py ファイルも実行されません。このようなファイルを含むパッケージもバンドルできますが、Cloud Functions で正しく実行されない場合があります。

ベンダリングされた依存関係

ベンダリングされた依存関係とは、ソースがソースコード パッケージに直接組み込まれ、独自のコードとともに再ビルドされる依存関係です。GOOGLE_VENDOR_PIP_DEPENDENCIES ビルド環境変数を使用して、ベンダリングされた pip 依存関係を作成し、デプロイ時にインストールされないようにします。

ベンダリングされた依存関係を作成する

  1. 開発システムに python3 がインストールされていることを確認します。

  2. 開発ツリーのルート ディレクトリにある requirements.txt ファイルで、アプリケーションの依存関係を宣言します。

  3. requirements.txt ファイルの別の行に functions-framework を含めることで、Functions Framework を要件として宣言します。

  4. 関数の依存関係をローカル ディレクトリにダウンロードします。これを行う手順は、依存関係が Python wheel(*.whl)ファイルか tar ファイル(*.tar.gz)かによって異なります。

    1. 依存関係が Python wheel(*.whl)の場合は、次の pip コマンドを使用して、開発ツリーのルート ディレクトリにダウンロードします。

      python3 -m pip download -r requirements.txt --only-binary=:all: \
         -d DIRECTORY \
         --python-version PYTHON_RUNTIME_NAME \
         --platform manylinux2014_x86_64 \
         --implementation cp
      

      次のように置き換えます。

      • DIRECTORY: ダウンロード先のローカル ディレクトリの名前
      • PYTHON_RUNTIME_NAME: 互換性チェックに使用する Python のバージョン

      結果として、ディレクトリ構造は次のようになります。

      myfunction/
      ├── main.py
      └── requirements.txt
      └── DIRECTORY
         ├── dependency1.whl
         └── dependency2.whl
      
    2. 依存関係が tar ファイル(*.tar.gz)の場合:

      1. 依存関係が Python で記述されている場合は、pip を使用してダウンロードします。

        python3 -m pip download -r requirements.txt \
           -d DIRECTORY
        
      2. 依存関係が C または C++ で記述されたコードで構成されている場合は、個別にダウンロードしてコンパイルする必要があります。

  5. 関数と、そのベンダリングされた依存関係をデプロイします。

    gcloud functions deploy FUNCTION_NAME \
      --runtime PYTHON_RUNTIME_NAME \
      --set-build-env-vars GOOGLE_VENDOR_PIP_DEPENDENCIES=DIRECTORY
    

    次のように置き換えます。

    • FUNCTION_NAME: デプロイする Cloud Functions 関数の名前
    • PYTHON_RUNTIME_NAME: デプロイされた関数を実行する Python ランタイムの名前(例: python311)。これは、ローカル開発環境で使用したのと同じ Python ランタイム バージョンにする必要があります。
    • DIRECTORY: ベンダリングされた依存関係を含むディレクトリの名前

Buildpack の使用の詳細については、Buildpack を使用して関数をビルドするをご覧ください。

プライベート依存関係を使用する

Artifact Registry のプライベート依存関係

Artifact Registry Python リポジトリでは、Python 関数のプライベート依存関係をホストできます。Cloud Functions にデプロイすると、ビルドプロセスによって、Cloud Build サービス アカウント用の Artifact Registry 認証情報が自動的に生成されます。requirements.txt には、追加の認証情報を生成せずに、Artifact Registry URL のみを含める必要があります。例:

--index-url REPOSITORY_URL
sampleapp
Flask==0.10.1
google-cloud-storage

ビルドで複数のリポジトリが必要な場合は、Artifact Registry 仮想リポジトリを使用して、pip がリポジトリを検索する順序を安全に制御します。

他のリポジトリのプライベート依存関係

依存関係は、SSH キーにはアクセスできない Cloud Build 環境にインストールされます。前のセクションで説明したように、SSH ベースの認証を必要とするリポジトリ内でホストされているパッケージは、プロジェクトのコードと合わせて組み込み、アップロードする必要があります。

次のように、アプリをデプロイする前に pip install コマンドを -t DIRECTORY フラグを指定して使用することで、プライベート依存関係をローカル ディレクトリにコピーできます。

  1. 依存関係をローカル ディレクトリにコピーします。

    pip install -t DIRECTORY DEPENDENCY
  2. 空の __init__.py ファイルを DIRECTORY ディレクトリに追加してモジュールに変換します。

  3. このモジュールから依存関係をインポートして使用します。

    import DIRECTORY.DEPENDENCY

プリインストールされているパッケージ

次の Python パッケージは、デプロイ時に関数と一緒に自動的にインストールされます。関数のコードでこれらのパッケージのいずれかを使用している場合、次のバージョンを requirements.txt ファイルに含めることをおすすめします。

Python 3.7

aiohttp==3.8.1
aiosignal==1.2.0
async-timeout==4.0.2
attrs==21.4.0
cachetools==4.2.4
certifi==2021.10.8
chardet==4.0.0
charset-normalizer==2.0.10
click==8.0.3
Flask==2.0.2
frozenlist==1.2.0
google-api-core==2.3.2
google-api-python-client==2.34.0
google-auth==2.3.3
google-auth-httplib2==0.1.0
google-cloud-core==2.2.1
google-cloud-trace==1.5.1
googleapis-common-protos==1.54.0
grpcio==1.43.0
grpcio-status==1.43.0
httplib2==0.20.2
idna==3.3
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
multidict==5.2.0
opencensus==0.8.0
opencensus-context==0.1.2
packaging==21.3
proto-plus==1.19.8
protobuf==3.19.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pyparsing==3.0.6
pytz==2021.3
PyYAML==6.0
requests==2.27.1
rsa==4.8
setuptools==60.3.1
six==1.16.0
uritemplate==4.1.1
urllib3==1.26.7
Werkzeug==2.0.2
wrapt==1.13.3
yarl==1.7.2

Python 3.8 およびそれ以降

click==8.1.7
cloudevents==1.9.0
deprecation==2.1.0
Flask==2.2.5
functions-framework==3.0.0
gunicorn==20.1.0
importlib-metadata==6.7.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
packaging==23.1
typing_extensions==4.7.1
watchdog==1.0.2
Werkzeug==2.2.3
zipp==3.15.0

* `pip` (latest version)
* `setuptools` (latest version)
* `wheel` (determined by product requirements)

また、Python ランタイムでは、実行環境に多数のシステム パッケージが含まれます。リストに含まれていないシステム パッケージを必要とする依存関係が関数で使用されている場合は、パッケージをリクエストできます。