カスタム ランタイムの構築

カスタム ランタイムでは、サポートされている任意の App Engine フレキシブル言語の別の方法での実装や、Google が提供する言語のカスタマイズができます。受信 HTTP リクエストを処理できる任意の言語でコードを記述することもできます()。カスタム ランタイムを使用すると、App Engine フレキシブル環境でインフラストラクチャのスケーリング、モニタリング、負荷分散を管理できるため、アプリケーションの構築に集中できます。

カスタム ランタイムを作成するには、次のことが必要です。

app.yaml ファイルの提供

app.yaml 構成ファイルには、少なくとも次の設定が含まれている必要があります。

runtime: custom
env: flex

アプリの設定について詳しくは、app.yaml によるアプリの構成をご覧ください。

Dockerfile の作成

Dockerfile の作成に関する包括的なドキュメントは、Docker ウェブサイトで参照できます。カスタム ランタイムを使用している場合は、独自のベースイメージを使用するか、Google のベースイメージを使用するにかかわらず、Dockerfile が必要になります。

Google ベースイメージの指定

Dockerfile の最初のコマンドは、通常はベースイメージを指定する FROM コマンドです。次の表では FROM コマンドを使用して、Google が提供するベースイメージを指定し、イメージの構築に使用する github プロジェクトを指定します。

ランタイム コマンド
Go
github プロジェクト
FROM gcr.io/google-appengine/golang
Java(Open JDK 8 のみ)
github プロジェクト
FROM gcr.io/google-appengine/openjdk Java 用 Dockerfile
Java(Open JDK 8 + Eclipse Jetty 9.3)
github プロジェクト
FROM gcr.io/google-appengine/jetty Java 用 Dockerfile
Python 2.7 & 3.6
github プロジェクト
FROM gcr.io/google-appengine/python
Node.js
github プロジェクト
FROM gcr.io/google-appengine/nodejs
Ruby
github プロジェクト
FROM gcr.io/google-appengine/ruby
PHP
github プロジェクト
FROM gcr.io/google-appengine/php

App Engine Service API の使用

golang ベースイメージを実行する Go アプリから App Engine Service API にアクセスするには、App Engine Go ライブラリをソースコードにインポートする必要があります。

カスタム Java ランタイムの使用

Java ランタイムをカスタマイズしてディレクティブを追加するには、Dockerfile を作成する必要があります。

Java 8 / Jetty 9 用のサンプル Dockerfile:

FROM gcr.io/google-appengine/jetty
ADD test-webapp-1.0-SNAPSHOT.war $JETTY_BASE/webapps/root.war
WORKDIR $JETTY_BASE
RUN java -jar $JETTY_HOME/start.jar --approve-all-licenses --add-to-startd=jmx,stats,hawtio 
&& chown -R jetty:jetty $JETTY_BASE

ここで、test-webapp-1.0-SNAPSHOT.war は、target/(maven)または build/staged-app/(gradle)ディレクトリにあるビルド済み WAR ファイルの名前です。

これに対し、Google が提供する Java ランタイムのカスタマイズされていないベースイメージを使用する場合は、App Engine にアプリをデプロイする際に Dockerfile は不要です。詳しくは、Java 8 ランタイムまたは Java 8 / Jetty 9 ランタイムをご覧ください。

Google が提供するすべてのイメージの一覧については、google-appengine プロジェクトをご覧ください。

Dockerfile の名前付けと配置

一般的に、Dockerfile には Dockerfile という名前が付けられ、対応する app.yaml ファイルと同じディレクトリに配置されます。ただし、ツール環境に応じて要件が異なる場合もあります。たとえば、Maven、Gradle、Eclipse、IntelliJ プラグインなどの Cloud SDK ベースの Java ツールでは、Dockerfilesrc/main/docker/Dockerfile に、app.yaml ファイルを src/main/appengine/app.yaml に配置する必要があります。詳しくは、ツール環境のドキュメントをご覧ください。

必要なコード構造

このセクションでは、Google が提供するベースイメージと独自のベースイメージのどちらを使用するかを問わず、コードに実装する必要がある動作を説明します。

ポート 8080 のリッスン

App Engine のフロントエンドは、受信リクエストをポート 8080 の適切なモジュールにルーティングします。アプリケーション コードが 8080 でリッスンしていることを確認する必要があります。

ライフサイクル イベントの処理

App Engine フレキシブル環境では、特定のライフサイクル イベントがアプリケーションに定期的に送信されます。

アプリケーションのシャットダウン

インスタンスをシャットダウンする場合、App Engine フレキシブル環境では通常、STOPSIGTERM)シグナルをアプリコンテナに送信します。アプリケーションがこのイベントに応答する必要はありませんが、これを使用することで、コンテナをシャットダウンする前に必要なクリーンアップ操作を行うことができます。通常の状態では、システムはアプリが停止するまで最大 30 秒待機してから、KILLSIGKILL)シグナルを送信します。

まれに、停止によって App Engine が 30 秒のシャットダウン時間を確保できず、インスタンスが終了する前に STOP および KILL シグナルが送信されない可能性があります。この可能性に対応するには、インスタンスの状態を定期的にチェックし、信頼できるデータストアとしてではなく、主にメモリ内キャッシュとして使用するようにします。

ヘルスチェック リクエスト

定期的なヘルスチェック リクエストを使用すると、VM インスタンスが正常にデプロイされたことを確認できます。また、実行中のインスタンスが正常な状態を維持していることも確認できます。

アプリケーションと Google Cloud Platform の統合

カスタム ランタイムで動作するアプリケーションは、Google Cloud Client Libraries を使用して Google Cloud Platform サービスにアクセスできます。 カスタム ランタイムのアプリケーションでは、標準 API を通じてサードパーティのサービスを利用することもできます。

Google Cloud Platform サービスによる認証

一般的に、アプリケーションのデフォルト認証情報を使用することで、Google API の認証と呼び出しを簡単に行うことができます。

Compute Engine Metadata API を使用してアクセス トークンによってアプリケーションを直接認証することも可能ですが、非常に複雑です。 これらのアクセス トークンは API リクエスト(Cloud Storage や Cloud Datastore サービスおよびリソースに対するリクエストなど)で使用できます。

認証オプションについて詳しくは、こちらをご覧ください。

ログ

App Engine で実行中のアプリケーションにリクエストが送信されると、リクエストとレスポンスの詳細が自動的に記録されます。Google Cloud Console のログビューアで確認できます。

アプリケーションがリクエストを処理するときに、独自のロギング メッセージを stdoutstderr に書き込むこともできます。これらのファイルは自動的に収集され、ログビューアで表示できます。サイズを制限するために、stdoutstderr への最新のエントリのみが保持されます。

アプリのリクエストログとアプリケーションログはCloud Loggingエージェントによって収集され、最長 90 日間、最大 1 GB まで保存されます。ログを長期間保存する場合や 1 GB を超えるサイズを保存する場合は、Cloud Storage にログをエクスポートできます。ログをさらに処理するために、BigQuery や Pub/Sub へエクスポートすることもできます。

その他のログも入手できます。デフォルトで構成されているログの一部を以下に挙げます。

ログ名 ペイロード タイプ 目的
crash.log text 設定が失敗したときに記録される情報。アプリケーションを実行できなかった場合は、このログを確認してください。
monitoring.* text Cloud Monitoring にデータを公開している Docker コンテナから取得した情報。
shutdown.log text シャットダウン時に記録された情報。
stdout テキスト アプリからの標準出力。
stderr テキスト コンテナからの標準エラー。
syslog テキスト Docker コンテナ外部の VM システムログ。