Python 3.8が一般提供になりました。

Python 3 ランタイム環境

Python 3 ランタイムは、ウェブサービスのコードとその依存関係をインストールしてサービスを実行する役割を果たすソフトウェア スタックです。

スタンダード環境の App Engine 用 Python 3 ランタイムは、app.yaml ファイル内で次のように宣言されています。

Python 3 のバージョン

Python 3 ランタイムは、Python 3.7 と Python 3.8 をサポートし、選択したバージョンの最新の安定版を使用します。App Engine ではアプリのデプロイ時に新しいリリース バージョンに自動的に更新されますが、マイナー バージョンの更新は自動的に行われません。

たとえば、Python 3.7.0 以降にデプロイしたアプリケーションが Python 3.7.1 に自動的にアップデートされることはあっても、Python 3.8.0 に自動的にアップデートされることはありません。

依存関係

デプロイ時に、App Engine は Python パッケージ マネージャー pip を使用して、プロジェクトのルート ディレクトリにある requirements.txt メタデータ ファイルで定義された依存関係をインストールします。依存関係は App Engine によって新しくインストールされるため、アップロードする必要はありません。

Pipfile / Pipfile.lock スタンダードを使用した依存関係の指定は現在サポートされていないため、プロジェクトではこれらのファイルを使用できません。

アプリケーションの起動

ランタイムは、app.yaml ファイル内の entrypoint フィールドで指定したコマンドを実行してアプリを起動します。エントリポイントは、PORT 環境変数で指定されたポートをリッスンするウェブサーバーを起動する必要があります。例:

entrypoint: gunicorn -b :$PORT main:app

アプリで使用するウェブ フレームワークは、アプリ内の適切なハンドラにリクエストをルーティングします。

アプリが次の要件を満たしている場合、entrypoint フィールドを指定しないと、App Engine は gunicorn ウェブサーバーでアプリを起動します。

  • アプリのディレクトリのルートに、app という WSGI 準拠のオブジェクトを含む main.py ファイルが格納されている。

  • アプリに Pipfile ファイルまたは Pipfile.lock ファイルが含まれていない。

また、entrypoint フィールドを指定しない場合、App Engine は gunicornrequirements.txt ファイルに自動的に追加します。

エントリポイントのおすすめの方法

  • エントリポイントを指定しない限り、requirements.txt ファイルに gunicorn を含めないでください。

  • パフォーマンスの観点から、エントリポイントを軽量化することが重要です。エントリポイントはアプリケーションの新しいインスタンスが作成されるたびに実行されるからです。

  • エントリポイント フィールドを使用して、アプリのパフォーマンスを調整できます。たとえば、gunicorn をウェブサーバーとして使用する場合は、エントリポイント フィールドで --workers フラグを使用して、アプリを処理するワーカーの数を構成できます。

    指定するワーカーの数は、App Engine アプリのインスタンス クラスと一致する必要があります。

    インスタンス クラス ワーカー
    F1 1
    F2 2
    F4 4
    F4_1G 8
    B1 1
    B2 2
    B4 4
    B4_1G 8
    B8 8

    このガイダンスは、ワーカー数を選択するための出発点として役立ちます。アプリのパフォーマンス特性によっては、上記とは異なる数のワーカーを使用しなければならない場合もあります。次の例は、2 つの gunicorn ワーカーを使用してアプリを処理する App Engine デプロイメントを示しています。

    entrypoint: gunicorn -b :8080 -w 2 main:app
    

その他のウェブ フレームワーク

Django や Flask に加えて、App Engine で uwsgiTornado などの他のウェブ フレームワークも使用できます。次の例は、App Engine で uwsgi を使用する方法を示しています。

runtime: python38
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.19.1
flask==1.1.2

環境変数

ランタイムは以下の環境変数を設定します。

環境変数 説明
GAE_APPLICATION App Engine アプリケーションの ID。この ID の先頭には「region code~」が付きます。たとえば、ヨーロッパでデプロイされたアプリケーションの場合は「e~」となります。
GAE_DEPLOYMENT_ID 現在のデプロイの ID。
GAE_ENV App Engine の環境。standard に設定します。
GAE_INSTANCE 現在サービスが実行されているインスタンスの ID。
GAE_MEMORY_MB アプリケーション プロセスで使用可能なメモリ量(MB)。
GAE_RUNTIME app.yaml ファイル内で指定したランタイム。
GAE_SERVICE app.yaml ファイル内で指定したサービス名。サービス名が指定されていない場合は、default に設定されます。
GAE_VERSION サービスの現在のバージョン ラベル。
GOOGLE_CLOUD_PROJECT アプリケーションに関連付けられた Cloud プロジェクト ID。
PORT HTTP リクエストを受信するポート。

app.yaml ファイル内で追加の環境変数を定義できますが、上記の値をオーバーライドすることはできません。

HTTPS プロキシと転送プロキシ

App Engine は、ロードバランサにおいて HTTPS 接続を終了し、リクエストをアプリケーションに転送します。アプリケーションによっては、元のリクエストの IP とプロトコルが何か確認する必要があります。ユーザーの IP アドレスは、標準の X-Forwarded-For ヘッダーで確認できます。この情報が必要なアプリケーションでは、プロキシを信頼するようにウェブ フレームワークを構成してください。

ファイル システム

このランタイムには完全なファイル システムが含まれています。このファイル システムの /tmp(App Engine インスタンスの RAM 内のデータを格納する仮想ディスク)以外の場所は読み取り専用です。

メタデータ サーバー

アプリケーションの各インスタンスは、App Engine メタデータ サーバーを使用してインスタンスとプロジェクトに関する情報を照会できます。

次のエンドポイントを介してメタデータ サーバーにアクセスできます。

  • http://metadata
  • http://metadata.google.internal

次の表に、特定のメタデータを取得するための HTTP リクエストの各エンドポイントを示します。

メタデータ エンドポイント 説明
/computeMetadata/v1/project/numeric-project-id プロジェクトに割り当てられているプロジェクト番号。
/computeMetadata/v1/project/project-id プロジェクトに割り当てられているプロジェクト ID。
/computeMetadata/v1/instance/zone インスタンスが実行されているゾーン。
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email プロジェクトに割り当てられているデフォルトのサービス アカウントのメール。
/computeMetadata/v1/instance/service-accounts/default/ プロジェクトのすべてのデフォルトのサービス アカウントを一覧表示します。
/computeMetadata/v1/instance/service-accounts/default/scopes デフォルトのサービス アカウントでサポートされているすべてのスコープを一覧表示します。
/computeMetadata/v1/instance/service-accounts/default/token アプリケーションを他の Google Cloud APIs に認証させるための認証トークンを返します。

たとえば、プロジェクト ID を取得するには、リクエストを http://metadata.google.internal/computeMetadata/v1/project/project-id に送信します。