Python 3 ランタイム環境

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

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

runtime: python37

Python 3 バージョン

Python 3.7 ランタイム環境では、最新の安定版である Python 3.7 が使用されています。App Engine ではデプロイ時に新しいマイナー リビジョンに自動的に更新されますが、メジャー バージョンの更新は自動的に行われません。

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

App Engine スタンダード環境で使用できる Python 3 ランタイムは、現在 Python 3.7 だけです。

依存関係

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

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

アプリケーションの起動

Python 3 ランタイムは、app.yaml ファイルのオプションのエントリポイント フィールドの内容を使用してアプリケーションを起動します。次に例を示します。

runtime: python37
entrypoint: gunicorn -b :$PORT main:app

アプリで HTTP リクエストを受信するには、エントリポイントで、PORT 環境変数で指定されたポートでリッスンするウェブサーバーを起動する必要があります。エントリポイントを使用するかどうかは選択できます。アプリが以下の条件を満たしていれば、App Engine は gunicorn をウェブサーバーとして使用し、そのパッケージを自動的に requirements.txt ファイルに追加します。

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

  • app.yaml にエントリポイントが含まれていない。

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

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

runtime: python37
entrypoint: uwsgi --http-socket :8080 --wsgi-file main.py --callable app --master --processes 1 --threads 2
uwsgi==2.0.17.1
flask==1.0.2

アプリはこの事前構成されたウェブサーバーを使用して、HTTP リクエストを実行します。

エントリポイントのベスト プラクティス

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

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

entrypoint フィールドを使用すると、アプリのパフォーマンスを調整できます。たとえば gunicorn をウェブサーバーとして使用する場合、entrypoint フィールドで --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 デプロイメントを示しています。

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

環境変数

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

環境変数 説明
GAE_APPLICATION App Engine アプリケーションの ID。
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 アプリケーションに関連付けられた GCP プロジェクトの ID。
NODE_ENV サービスがデプロイされたとき production に設定。
PORT HTTP リクエストを受信するポート。

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

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 API に認証させるための認証トークンを返します。

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

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Python 3 の App Engine スタンダード環境