Python アプリのデプロイ

アプリのデプロイとは、開発したアプリを App Engine にアップロードして実行することです。アプリをデプロイすると、そのアプリのバージョンと、それに対応するサービスが App Engine の中に作成されます。アプリ全体(すべてのソースコードと設定ファイルも含む)をデプロイすることも、個々のバージョンまたは設定ファイルをデプロイして更新することもできます。

プログラムによってアプリをデプロイするには、Admin API を使用します。

始める前に

アプリをデプロイする前に:

gcloud ツールでアプリをデプロイする場合は、Google Cloud SDK をダウンロードしてインストールし、初期化する必要があります。

SDK をダウンロード

gcloud ツールがすでにインストールされている環境で、初期化時に指定した ID とは異なる GCP プロジェクト ID を使用する場合は、Cloud SDK 構成の管理をご覧ください。

プロキシの使用

HTTP または HTTPS プロキシを使用するシステムからデプロイ コマンドを実行する場合には、プロキシ経由で通信を行うようにツールを設定する必要があります。

gcloud

次のコマンドを実行して、gcloud ツールを構成します。

gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]

プロキシに usernamepassword を設定することもできます。詳細については、gcloud config をご覧ください。

appcfg

プロキシの環境変数を設定します。

Mac / Linux
export HTTP_PROXY="http://cache.example.com:3128"
export HTTPS_PROXY="http://cache.example.com:3128"
Windows
set HTTP_PROXY=http://cache.example.com:3128
set HTTPS_PROXY=http://cache.example.com:3128

アプリをデプロイする

アプリを App Engine にデプロイするには、構成ファイルapp.yaml など)が配置されているアプリケーションのルート ディレクトリから gcloud app deploy コマンドを実行します。

gcloud

gcloud app deploy [YOUR_DEPLOYMENTS]

[YOUR_DEPLOYMENTS] は 1 つ以上の設定ファイルのパスと名前です。設定ファイルの間をスペース 1 個で区切ります。デフォルトでは、設定ファイルを指定しないと、app.yaml がデプロイされます。

オプション フラグ:

  • カスタム バージョン ID を指定するには、--version フラグを指定します。指定しなかった場合は、自動的に生成されます。
  • アプリをデプロイするときに、このバージョンにすべてのトラフィックを自動的にルーティングしない場合は、--no-promote フラグを指定します。
  • gcloud ツールでデフォルトとして初期設定したものに代わる GCP プロジェクト ID を指定するには、--project フラグを指定します。

例:

gcloud app deploy
gcloud app deploy app.yaml dos.yaml index.yaml
gcloud app deploy --version [YOUR_VERSION_ID] --no-promote --project [YOUR_PROJECT_ID]

デフォルトでは、デプロイする各バージョンが 100% のトラフィックを受信するように自動的に設定されます。構成オプションについては、gcloud app deploy リファレンス--promote フラグの説明をご覧ください。

ヒント: コマンドラインから gcloud help を実行すると、引数とフラグの完全なリストを確認できます。

appcfg

元の Python 用 App Engine SDK をインストールしている場合は、次のコマンドを実行できます。

appcfg.py -A [YOUR_PROJECT_ID] -V [YOUR_VERSION_ID] update [YOUR_APP_DIR]

デフォルトでは、そのサービスに対して最初にデプロイされたバージョンが自動的に、トラフィックの 100% を受け取るように構成されます。ただし、同じサービスに対してデプロイされるそれ以降のバージョンはすべて、手動で構成しない限り、トラフィックを受け取ることはありません。

一意のバージョン ID を選択する

手動でスケーリングされているインスタンスの場合は、数値のインスタンス ID と区別するために、バージョン ID の先頭を文字にする必要があります。これによりリクエストが正しい宛先に確実にルーティングされ、URL パターンのあいまいさを回避することができます。たとえば、123.my-service.appspot.com は次の 2 通りの解釈が可能です。

  • バージョン 123 が存在する場合は、my-service サービスのバージョン 123 にリクエストをルーティングする。
  • バージョン 123 が存在しない場合は、その代わりに、my-service サービスの各バージョンが実行されているインスタンス ID 123 にリクエストをルーティングする。

ただし、自動スケーリングまたは基本スケーリング用に構成されているインスタンスについては、バージョンに名前を付けることができます。これは、そのようなインスタンスをターゲットにすることはできないためです。

複数サービス アプリケーションをデプロイする

アプリケーションが複数のサービスで構成されている場合は、対象のサービスを個別にデプロイして更新することも、すべてのサービスを同時にデプロイすることもできます。更新内容をサービスにデプロイするときに、個々の設定ファイルを更新することや、対応するバージョンのソースコードを更新することもできます。

たとえば、2 つのバージョンをデプロイして App Engine の中に作成するとします。各バージョンは専用のサービスで実行されます。最初のバージョンはアプリのフロントエンド サービス、他方のバージョンはバックエンド サービスを担当します。この場合に、個々の設定ファイルをデプロイすると、一方のサービスの設定のみが更新されます。また、フロントエンドとバックエンドの一方または両方のソースコードを更新するために、特定のサービスの新しいバージョンをデプロイすることもできます。

複数サービスの要件

アプリケーションのサービスが複数の場合も、デプロイと更新のためのコマンドは同じですが、次の要件があります。

  • 最初にアプリのバージョンの 1 つを default サービスにデプロイする必要があります。これで、以降のサービスを作成してデプロイできるようになります。

  • サービスの ID は、対応するバージョンの app.yaml 構成ファイルで指定する必要があります。サービス ID を指定するには、各構成ファイルに service: [YOUR_SERVICE_ID] 要素定義を追加します。デフォルトでは、この要素定義が構成ファイルで指定されていない場合のバージョンのデプロイ先は default サービスとなります。

  • 複数のサービスを同時にデプロイするには、対応するすべての app.yaml 構成ファイルをデプロイ コマンドの中で指定する必要があります。

複数のサービスをデプロイするには

アプリケーションのルート ディレクトリ(ここに設定ファイルが存在します)からデプロイ コマンドを実行するときに、各サービスの app.yaml ファイルの相対パスとファイル名を指定します。

gcloud

gcloud app deploy [DEPLOYMENTS]

appcfg

appcfg.py update [DEPLOYMENTS]

[DEPLOYMENTS] は 1 つ以上の設定ファイルのパスと名前です。構成ファイルの間をスペース 1 個で区切ります。

gcloud

gcloud app deploy main/app.yaml service1/app.yaml service2/app.yaml

appcfg

appcfg.py update main/app.yaml service1/app.yaml service2/app.yaml

各サービスが正常にデプロイされると、その確認がコマンドラインに表示されます。

インデックスの更新

アプリで使用するインデックスを作成または更新するには、index.yaml 構成ファイルを Cloud Datastore にアップロードします。この構成ファイルがアップロードされた後、まだ存在していないインデックスが作成されます。

App Engine によるすべてのインデックスの作成が完了するまでに、しばらく時間がかかることがあるため、このようなインデックスは App Engine ですぐに使用できるようにはなりません。アプリがすでにトラフィックを受け取るように設定されている場合は、まだ作成中のインデックスを必要とするクエリに対して例外が発生する可能性があります。

例外を避けるには、次のように、すべてのインデックスを作成するための時間を確保する必要があります。

  • バージョンをデプロイする前に、index.yaml 構成ファイルを Cloud Datastore にアップロードします。

    1. index.yaml ファイルを Cloud Datastore にアップロードします。

      appcfg
      appcfg.py -A [YOUR_PROJECT_ID] -V [YOUR_VERSION_ID] update_indexes [YOUR_APP_DIR]

    2. GCP Console を使用して、すべてのインデックスのステータスをモニタリングします。

      [データストア] ページに移動

    3. すべてのインデックスが作成されたら、App Engine の新しいバージョンをデプロイします。

  • トラフィックをバージョンに移行または分割する前に、インデックスを作成します。

    1. 新しいバージョンをデプロイし、そのバージョンにトラフィックがルーティングされないようにします。
      gcloud
      app.yaml ファイルと index.yaml ファイルを両方とも指定し、そのバージョンにトラフィックがルーティングされないように --no-promote フラグも指定する必要があります。
      gcloud app deploy app.yaml index.yaml --no-promote
      appcfg
      appcfg.py -A [YOUR_PROJECT_ID] -V [YOUR_VERSION_ID] update [YOUR_APP_DIR]
    2. GCP Console を使用して、すべてのインデックスのステータスをモニタリングします。

      [データストア] ページに移動

    3. すべてのインデックスが作成されたら、GCP Console を使用して、トラフィックをバージョンに移行または分割します。

      [バージョン] ページに移動

インデックスの詳細については、データストア インデックスの構成をご覧ください。

トラブルシューティング

発生する可能性のあるエラー メッセージのうち主なものを次に示します。

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
必要な App Engine アプリケーションが GCP プロジェクトに含まれていない場合、gcloud app deploy コマンドは、gcloud app create コマンドを実行しようとして失敗することがあります。オーナーの役割を持つアカウントだけが、App Engine アプリケーションを作成するために必要な権限を持っています。
Command not found

SDK のインストール時に appcfg.py または dev_appserver.py ツールにシンボリック リンクを作成していない場合、ツールを実行するために完全なディレクトリ パス([PATH_TO_APP_ENGINE_SDK]/appcfg.py[PATH_TO_CLOUD_SDK]/bin/dev_appserver.py など)の指定が必要になる場合があります。

注: appcfg.py を使用するには、元の Python 用 App Engine SDK をダウンロードしてインストールする必要があります。

Import Error

Google Cloud SDK と元の App Engine SDK の両方をインストールしている場合、PATH へのエントリが互いに競合し、インポート エラーが発生する可能性があります。Cloud SDK コマンドの実行中にエラーが発生した場合は、元の App Engine SDK を明示的に使用してみてください。これらのコマンドが優先されるように、元の App Engine SDK のエントリを PATH の前に移動することができます。または、完全なディレクトリ パス([PATH_TO_APP_ENGINE_SDK]/dev_appserver.py)を指定してコマンドを実行することもできます。
ヒント: Linux または Mac では、which dev_appserver.py を実行して PATH 内の最初の SDK を判断できます。

[400] The first service (module) you upload to a new application must be the 'default' service (module)

アプリケーションの複数のサービスをデプロイして作成するには、その前に default サービスをデプロイして作成する必要があります。バージョンを default サービスにデプロイする方法の詳細については、複数サービス アプリケーションをデプロイするをご覧ください。

Too Many Versions (403)

App Engine では、アプリケーションのデプロイ済みバージョン数の上限が定められています。これは、無料アプリケーションとデプロイ済みアプリケーションとで異なります。GCP Console を使用して古いバージョンを削除し、最新のコードをアップロードすることができます。

次のステップ

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

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

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