Node.js ランタイム環境

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

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

Node.js 10

runtime: nodejs10

Node.js 12(ベータ版)

runtime: nodejs12

Node.js 8

runtime: nodejs8

Node.js バージョン

Node.js ランタイムは、Node.js の最新リリースとそれに対応する npm のリリースを使用します。 App Engine ではデプロイ時に新しいマイナー リビジョンに自動的に更新されますが、メジャー バージョンの更新は自動的に行われません。

たとえば、Node.js 10.9.4 のときにデプロイしたアプリケーションは、その後、自動アップデートでバージョン 10.10.0 になることはあっても、Node.js 12.x.x に自動アップデートされることはありません。

マイナー バージョンとパッチ バージョンは自動的に更新されるため、package.json ファイル内の engines.node プロパティではメジャー バージョンのみを指定できます。

Node.js 10

{
  "engines": {
    "node": "10.x.x"
  }
}

Node.js 12(ベータ版)

{
  "engines": {
    "node": "12.x.x"
  }
}

Node.js 8

{
  "engines": {
    "node": "8.x.x"
  }
}

engines.node プロパティは省略可能ですが、指定する場合は、app.yaml ファイルで指定された Node.js のバージョンと互換性がある値でなければなりません。例:

Node.js 10

  • 10.x.x
  • ^10.0.0
  • ~10
  • >=6

Node.js 12(ベータ版)

  • 12.x.x
  • ^12.0.0
  • ~12
  • >=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 パッケージをサポートするために、ImageMagickFFmpegChrome ヘッドレスなどのツールを使用可能にするシステム パッケージが組み込まれています。 パッケージの一覧は、組み込みシステム パッケージをご覧ください。サポートが必要なパッケージがある場合は、公開バグトラッカーに問題を登録してください。

アプリケーションの起動

デフォルトでは、ランタイムは node server.js を実行してアプリケーションを起動します。 package.json ファイルで start スクリプトを指定すると、ランタイムは代わりに指定された起動スクリプトを実行します。例:

"scripts": {
  "start": "node app.js"
}

アプリで HTTP リクエストを受信するには、start スクリプトでホスト 0.0.0.0PORT 環境変数で指定され、Node.js で process.env.PORT としてアクセスできるポートでリッスンするウェブサーバーを起動する必要があります。

パフォーマンスの観点から、start スクリプトを軽量化し、そこでビルドステップを行わないことが重要です。このスクリプトは、アプリケーションの新しいインスタンスが作成されるたびに実行されるためです。

この動作は、app.yamlentrypoint フィールドでスクリプトを指定することによってオーバーライドできます。ランタイムは、node server.js または起動スクリプトを実行する代わりに、entrypoint で指定したコマンドを使用してアプリケーションを起動します。

環境変数

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

環境変数 説明
GAE_APPLICATION App Engine アプリケーションの ID。 この ID の先頭には「リージョン コード ~」が付きます。たとえば、ヨーロッパでデプロイされたアプリケーションの場合は「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 API に認証させるための認証トークンを返します。

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