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 ファイルの例を次に示します。

requests==2.20.0
numpy

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

依存関係を関数とまとめてパッケージ化してデプロイすることもできます。この方法は、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 で正しく実行されない場合があります。

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

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

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

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

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

依存関係は、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.6.2
async-timeout==3.0.1
attrs==19.3.0
cachetools==4.1.1
certifi==2020.6.20
chardet==3.0.4
click==7.1.2
Flask==1.1.2
google-api-core==1.21.0
google-api-python-client==1.10.0
google-auth==1.19.2
google-auth-httplib2==0.0.4
google-cloud-core==1.3.0
google-cloud-trace==0.23.0
googleapis-common-protos==1.52.0
grpcio==1.30.0
httplib2==0.18.1
idna==2.9
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
multidict==4.7.6
opencensus==0.7.9
opencensus-context==0.1.1
pip==20.1.1
protobuf==3.12.2
pyasn1==0.4.8
pyasn1-modules==0.2.8
pytz==2020.1
PyYAML==5.3.1
requests==2.24.0
rsa==4.6
setuptools==47.3.1
six==1.15.0
uritemplate==3.0.1
urllib3==1.25.9
Werkzeug==1.0.1
wheel==0.34.2
wrapt==1.12.1
yarl==1.5.1

Python 3.8

cachetools==4.2.2
certifi==2021.5.30
charset-normalizer==2.0.6
click==7.1.2
cloudevents==1.2.0
deprecation==2.1.0
flask==1.1.2
functions-framework==2.2.1
google-auth==2.2.0
gunicorn==20.0.4
idna==3.2
itsdangerous==1.1.0
jinja2==2.11.2
markupsafe==1.1.1
packaging==21.0
pathtools==0.1.2
pip==21.1.1
pyasn1-modules==0.2.8
pyasn1==0.4.8
pyparsing==2.4.7
requests==2.26.0
rsa==4.7.2
setuptools==58.1.0
urllib3==1.26.7
watchdog==1.0.2
werkzeug==1.0.1

Python 3.9

click==7.1.2
cloudevents==1.2.0
deprecation==2.1.0
Flask==1.1.2
functions-framework==2.2.1
gunicorn==20.0.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
pathtools==0.1.2
watchdog==1.0.2
Werkzeug==1.0.1

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