アプリケーションのテストとデプロイ

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r が App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

アプリケーションをローカルで実行し、App Engine にデプロイしてテストする方法を学びます。

ローカルでの実行

デプロイ前にアプリケーションの機能をテストするには、普段使用している開発ツールを使用して、アプリケーションをローカル環境で実行します。

アプリケーションのデプロイ

gcloud app deploy コマンドを使用して、アプリケーションを App Engine にデプロイします。このコマンドは、Cloud Build サービスを使用してコンテナ イメージを自動的に作成し、そのイメージを App Engine フレキシブル環境にデプロイします。このコンテナには、ローカルでランタイム イメージに行った変更が含まれます。

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

始める前に

アプリケーションをデプロイする前に、次のことを確認してください。

デプロイの成功の確認

更新されたヘルスチェックを有効にすると、デプロイしたアプリケーションが正常なステータスにならない場合、デプロイがロールバックされます。

最初のアプリケーションをフレキシブル環境にデプロイするときに、仮想マシン(VM)や他のインフラストラクチャが設定されていると、遅延が発生することがあります。最初のセットアップ後、ヘルスチェックは、インスタンスが正常で、トラフィックを受信可能な状態であることを確認します。app.yaml ファイルの liveness_check セクションの initial_delay_sec フィールドで指定された時間内にアプリケーションが準備完了ステータスに到達しない場合、デプロイは失敗しロールバックされます。

アプリケーションが準備完了になるまで時間がかかる場合があります。たとえば、アプリケーションを初期化するために、大きなファイルのダウンロードやキャッシュのプリロードを行う場合があります。最新のヘルスチェックを使用している場合は、app.yaml ファイルの readiness_check セクションで app_start_timeout_sec 構成設定を変更して、この時間を延長できます。

デプロイが失敗した場合は、Cloud Build API がプロジェクトで有効になっていることを確認してください。App Engine は初めてアプリをデプロイする際、この API を自動的に有効にしますが、API を無効にした場合、デプロイが失敗します。

サービスのデプロイ

アプリケーション サービスのバージョンと構成ファイルをデプロイし、App Engine にアプリケーションをデプロイします。

アプリケーションのサービスをデプロイするには、サービスの app.yaml ファイルが存在するディレクトリから次のコマンドを実行します。

gcloud app deploy

デフォルトでは、gcloud app deploy コマンドは、現在のディレクトリに app.yaml ファイルのみをデプロイします。このコマンドを実行すると、App Engine はデプロイするバージョンの一意の ID を生成し、gcloud CLI で使用するように構成した Cloud プロジェクトにそのバージョンをデプロイして、すべてのトラフィックを新しいバージョンに転送します。新しいバージョンがデフォルトのバージョンになります。

gcloud app deploy コマンドのデフォルトの動作は、対象のファイルを指定するか、バージョンを指定するか、追加のパラメータを指定することで変更できます。

  • サービスの他の構成ファイルは、各ファイルを個別に対象として指定しデプロイできます。次に例を示します。

    gcloud app deploy cron.yaml
    gcloud app deploy dispatch.yaml
    gcloud app deploy index.yaml
    
  • 独自のバージョン ID を指定するには、--version フラグを使用します。

  • トラフィックが新しいバージョンに自動的にルーティングされないようにするには、--no-promote フラグを使用します。

  • 特定の Cloud プロジェクトにデプロイするには、--project フラグを使用します。

たとえば、app.yaml で定義されているサービスを特定の Cloud プロジェクトにデプロイし、独自のバージョン ID を割り当て、トラフィックが新しいバージョンに転送されないようにするには、次のコマンドを実行します。

gcloud app deploy --project PROJECT_ID --version VERSION_ID --no-promote

このコマンドの詳細については、gcloud app deploy リファレンスをご覧ください。

複数のサービスのデプロイ

アプリケーションを構成する複数のサービスをデプロイまたは更新する場合にも、同じデプロイ コマンドを使用します。

複数のサービスをデプロイするには、各サービスの app.yaml ファイルを個別にデプロイする必要があります。次に例を示します。

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

1 つのデプロイ コマンドで、複数のファイルを指定できます。

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

複数のサービスをデプロイするための要件

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

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

ファイルの無視

.gcloudignore ファイルを使用すると、サービスのデプロイ時に Google Cloud にアップロードしないファイルとディレクトリを指定できます。これは、デプロイ時にアップロードする必要のないビルド アーティファクトやその他のファイルを無視する場合に便利です。

.gcloudignore ファイルの構文の詳細については、gcloud リファレンスをご覧ください。

デプロイで使用するコンテナを手動で作成する

Google Cloud Platform 以外でコンテナ イメージをビルドするには、まずイメージをコンテナ イメージのリポジトリにアップロードする必要があります。これで、gcloud app deploy コマンドを使用してイメージを App Engine にデプロイできるようになります。

たとえば Docker でローカルにコンテナ イメージを作成する場合、このイメージを Google Container Registry に push し、コマンドの --image-url フラグでイメージの URL を次のように指定できます。

gcloud app deploy --image-url gcr.io/YOUR_PROJECT_ID/YOUR_CONTAINER_IMAGE

自動の継続的デプロイ パイプラインの使用

Cloud Build では、継続的デプロイ パイプラインを使用してデプロイを自動化できます。詳細については、Cloud Build ドキュメントのアーティファクトのデプロイおよびビルドトリガーを使用したビルドの自動化をご覧ください。

PHP の Docker ベースイメージ

PHP カスタム ランタイム アプリケーションをゼロから作成する場合は、Dockerfile で提供されるベースイメージを使用します。

バージョン Docker コマンド
PHP 5.6 FROM gcr.io/google-appengine/php56
PHP 7.0 FROM gcr.io/google-appengine/php70
PHP 7.1 FROM gcr.io/google-appengine/php71
PHP 7.2 FROM gcr.io/google-appengine/php72
PHP 7.3 FROM gcr.io/google-appengine/php73

ベースイメージのソースコードは https://github.com/GoogleCloudPlatform/php-docker から入手できます。

アプリケーションの表示

アプリケーションを App Engine にデプロイした後、次のコマンドを実行してブラウザを起動できます。https://PROJECT_ID.REGION_ID.r.appspot.com にアクセスすると、アプリケーションが表示されます。

gcloud app browse

App Engine でのテスト

新しいバージョンを構成してトラフィックを受信する前に、App Engine でテストを行うことができます。たとえば、default サービスの新しいバージョンをテストする手順は次のとおりです。

  1. 新しいバージョンをデプロイして --no-promote フラグを指定します。

    gcloud app deploy --no-promote
  2. 次の URL に移動して、新しいバージョンにアクセスします。

    https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com

    これで、新しいバージョンを App Engine ランタイム環境でテストできるようになりました。アプリケーションをデバッグするには、Google Cloud Console のログビューアにログを表示します。詳細については、アプリケーション ログの書き込みをご覧ください。

    https://PROJECT_ID.REGION_ID.r.appspot.com に送信されたリクエストは、トラフィックを受信するように以前に構成したバージョンに引き続きルーティングされます。

  3. トラフィックが新しいバージョンに送信されるようにするには、Cloud Console でトラフィックを移行します。

    バージョンの管理

    デプロイしたバージョンを選択して、[トラフィックを移行] をクリックします。

同じ手順で他のサービスの新しいバージョンをテストできます。この場合、上記の URL の default をサービスの名前に置き換えます。

特定のサービスとバージョンをターゲットにする方法については、リクエストのルーティング方法をご覧ください。

トラブルシューティング

アプリのデプロイ時に発生する可能性のある一般的なエラー メッセージは次のとおりです。

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
必要な App Engine アプリケーションが Cloud プロジェクトに含まれていない場合、gcloud app deploy コマンドが gcloud app create コマンドを実行しようとしたときに失敗する可能性があります。App Engine アプリケーションの作成に必要な権限は、オーナーのロールを持つアカウントのみに付与されています。
502 Bad Gateway
app.yaml の構成に誤りがあると、Cloud プロジェクトを起動できないことがあります。詳細なエラー メッセージについては、アプリのログを確認してください。
[13] An internal error occurred while creating a Cloud Storage bucket.

アプリケーションと同じリージョンに、App Engine がユーザーに代わってデフォルトの Cloud Storage マルチリージョン バケットを作成します。このバケットは、アプリケーションのコンテンツを保存するために必要です。以下のシナリオで、このバケットを作成できない場合に、このエラーが返されます。

[13] An internal error occurred.

このエラーは、共有 VPC 設定を使用してネットワーク構成でサービスをデプロイしている場合に発生します。App Engine フレキシブル環境が、この構成のすべての要件を満たしていることを確認します。次に、この設定用に構成されたサービス アカウントがプロジェクト内に存在することを確認します。存在しない場合は、アカウントを復元する必要があります。共有 VPC ホスト プロジェクトのサブネットのリージョンは、App Engine 環境が作成されたロケーションと一致する必要があります。

app.yaml 構成が有効なことを確認しても問題が解決しない場合は、Google Cloud SDK を使用し、--verbosity=debug フラグを追加してサービスを再デプロイします。GCP サポートに連絡して、コマンドの出力を提供します。

IP space of {USER_SUBNETWORK_NAME} is exhausted and needs to be expanded.

このエラー メッセージでデプロイが失敗した場合、App Engine サービス用に構成されたネットワークに、サービスの新しいインスタンスに割り振るアドレスが残っていないことを示します。この問題を解決するには、App Engine フレキシブル環境サービス用に構成されたサブネットで VPC の範囲を拡張します。