Node.js ランタイムは、ウェブサービスのコードとその依存関係をインストールしてサービスを実行する役割を果たすソフトウェア スタックです。
スタンダード環境の App Engine 用 Node.js ランタイムは、app.yaml
ファイル内で次のように宣言されています。
Node.js 12
runtime: nodejs12
Node.js 10
runtime: nodejs10
Node.js 8(非推奨)
runtime: nodejs8
Node.js バージョン
Node.js ランタイムは、Node.js 12、Node.js 10、Node.js 8(非推奨)をサポートし、選択したバージョンの最新の安定版を使用します。App Engine ではアプリのデプロイ時に新しいリリース バージョンに自動的に更新されますが、マイナー バージョンの更新は自動的に行われません。
たとえば、Node.js 10.9.4 のときにデプロイしたアプリケーションは、その後、自動アップデートでバージョン 10.10.0 になることはあっても、Node.js 12.x.x に自動アップデートされることはありません。
マイナー バージョンとパッチ バージョンは自動的に更新されるため、package.json
ファイル内の engines.node
プロパティではメジャー バージョンのみを指定できます。
Node.js 12
{
"engines": {
"node": "12.x.x"
}
}
Node.js 10
{
"engines": {
"node": "10.x.x"
}
}
Node.js 8(非推奨)
{
"engines": {
"node": "8.x.x"
}
}
engines.node
プロパティは省略可能ですが、指定する場合は、app.yaml
ファイルで指定された Node.js のバージョンと互換性がある値でなければなりません。例:
Node.js 12
12.x.x
^12.0.0
~12
>=6
Node.js 10
10.x.x
^10.0.0
~10
>=6
Node.js 8(非推奨)
8.x.x
^8.0.0
~8
>=6
package.json
ファイル内で互換性のない Node.js バージョンを指定すると、デプロイが失敗し、エラー メッセージが表示されます。
依存関係
デプロイ中に、ランタイムによって npm install
コマンドを使用して、または yarn.lock
ファイルが存在する場合は yarn install
コマンドを使用して、依存関係がインストールされます。詳細については、依存関係の指定をご覧ください。このランタイムによるインストールは新規インストールであるため、node_modules
フォルダをアップロードする必要はありません。
このランタイムには、ネイティブ拡張を必要とする Node.js パッケージをサポートするために、ImageMagick、FFmpeg、Chrome ヘッドレスなどのツールを使用可能にするシステム パッケージが組み込まれています。 パッケージの一覧は、組み込みシステム パッケージをご覧ください。サポートが必要なパッケージがある場合は、公開バグトラッカーに問題を登録してください。
アプリケーションの起動
デフォルトでは、ランタイムは node server.js
を実行してアプリケーションを起動します。
package.json
ファイルで start
スクリプトを指定すると、ランタイムは代わりに指定された起動スクリプトを実行します。例:
"scripts": {
"start": "node app.js"
}
アプリで HTTP リクエストを受信するには、start
スクリプトでホスト 0.0.0.0
とPORT
環境変数で指定され、Node.js で process.env.PORT
としてアクセスできるポートでリッスンするウェブサーバーを起動する必要があります。
パフォーマンスの観点から、start
スクリプトを軽量化し、そこでビルドステップを行わないことが重要です。このスクリプトは、アプリケーションの新しいインスタンスが作成されるたびに実行されるためです。
この動作は、app.yaml
の entrypoint
フィールドでスクリプトを指定することによってオーバーライドできます。ランタイムは、node server.js
または起動スクリプトを実行する代わりに、entrypoint
で指定したコマンドを使用してアプリケーションを起動します。
環境変数
ランタイムは以下の環境変数を設定します。
環境変数 | 説明 |
---|---|
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。 |
NODE_ENV |
サービスがデプロイされたとき production に設定します。 |
PORT |
HTTP リクエストを受信するポート。 |
app.yaml
ファイル内で追加の環境変数を定義できますが、NODE_ENV
以外、上記値のオーバーライドはできません。
HTTPS プロキシと転送プロキシ
App Engine は、ロードバランサにおいて HTTPS 接続を終了し、リクエストをアプリケーションに転送します。アプリケーションによっては、元のリクエストの IP とプロトコルが何か確認する必要があります。ユーザーの IP アドレスは、標準の X-Forwarded-For
ヘッダーで確認できます。この情報が必要なアプリケーションでは、プロキシを信頼するようにウェブ フレームワークを構成してください。
Express.js では、次の trust proxy
設定を使用します。
app.set('trust proxy', true);
ファイルシステム
このランタイムには完全なファイル システムが含まれています。このファイル システムの /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
に送信します。