Node.js ランタイム

Cloud Run 関数は、オペレーティング システムのバージョンに加えて、アドオン パッケージ、言語サポート、お使いの関数をサポートして呼び出す Functions Framework ライブラリで構成される環境で実行されます。この環境は言語バージョンで識別され、ランタイムとして知られています。

ランタイムに関する一般的な情報と、各 Node.js ランタイムが使用する Ubuntu のバージョンについては、Cloud Run 関数の実行環境をご覧ください。

Node.js で Cloud Run functions のビルドとデプロイを開始するには、クイックスタートをご覧ください。

ローカル システムで関数をビルドおよびテストするには、Functions Framework を使用して関数を実行するをご覧ください。

ランタイムを選択する

Cloud Run functions は、ランタイム サポートのページに記載されている複数のバージョンの Node.js をサポートしています。デプロイ時に、関数に求められる Node.js ランタイムを選択できます。

実行環境

実行環境には、ランタイム、オペレーティング システム、パッケージ、関数を呼び出すライブラリが含まれます。

Node.js 18 およびそれ以降のバージョンでは、Ubuntu 22.04 に基づく実行環境を使用します。Node.js 18 より前のバージョンは Ubuntu 18.04 に基づいています。詳しくは、Cloud Run 関数の実行環境をご覧ください。

関数を呼び出すライブラリは Node.js Functions Framework です。

ソースコードの構造

Cloud Run functions で関数の定義を見つけられるよう、ランタイムごとに、ソースコードの構造に対する特定の要件があります。詳細については、Cloud Run 関数の作成をご覧ください。

依存関係を指定する

関数の依存関係は package.json ファイルに指定します。詳しくは、Node.js での依存関係の指定をご覧ください。

NPM ビルド スクリプト

デフォルトでは、package.jsonbuild スクリプトが検出されると、Node.js ランタイムによって npm run build が実行されます。アプリケーションの起動前にビルドステップをさらに制御する必要がある場合は、gcp-build スクリプトを package.json ファイルに追加して、カスタム ビルドステップを指定できます。

ビルドで npm run build スクリプトが実行されないようにするには、次のいずれかの方法を使用できます。

  • package.json ファイルに、空の値を持つ gcp-build スクリプトを追加する: "gcp-build":""

  • ビルド環境変数 GOOGLE_NODE_RUN_SCRIPTS を空文字列に設定して、すべてのスクリプトが実行されないようにする。

非同期関数の完了

コールバックや Promise オブジェクトを含む非同期タスクを行う場合は、関数がこれらのタスクの実行を完了したことをランタイムに明示的に通知する必要があります。これは、次のサンプルに示すように、いくつかの方法で行うことができます。重要なのは、コードが非同期タスクまたは Promise が完了するのを待ってから戻る必要があるということです。これを行わないと、関数の非同期コンポーネントが完了前に終了する可能性があります。

イベント ドリブン関数

暗黙的な復帰

  exports.implicitlyReturning = async (event, context) => {
    return await asyncFunctionThatReturnsAPromise();
  };

明示的な復帰

  exports.explicitlyReturning = function (event, context) {
    return asyncFunctionThatReturnsAPromise();
  };

HTTP 関数

Node.js

// OK: await-ing a Promise before sending an HTTP response
await Promise.resolve();

// WRONG: HTTP functions should send an
// HTTP response instead of returning.
return Promise.resolve();

// HTTP functions should signal termination by returning an HTTP response.
// This should not be done until all background tasks are complete.
res.send(200);
res.end();

// WRONG: this may not execute since an
// HTTP response has already been sent.
return Promise.resolve();

ミドルウェアを使用して HTTP リクエストを処理する

Node.js HTTP Cloud Run functions では、HTTP リクエストを単純にするために、ExpressJS との互換性がある request および response オブジェクトが提供されます。Cloud Run functions ではリクエスト本文が自動的に読み取られるため、受け取るリクエスト本文は常にメディアタイプと独立しています。つまり、HTTP リクエストはコードの実行時までに完全に読み取られているものと想定されています。ExpressJS アプリをネストする際は、この点に注意する必要があります。特に、リクエスト本文が読み取られていないと想定しているミドルウェアは、想定どおりに動作しない可能性があります。

ES モジュールを使用する

ECMAScript モジュール(ES モジュールまたは ESM)は Node 14 以降の TC39 の標準でフラグ付けなしの機能で、JavaScript モジュールの読み込みに使用されます。ESM は、CommonJS とは異なり、モジュールを読み込むための非同期 API を提供します。また、構文も改善されています。Cloud Run 関数の中で require ステートメントの代わりに importexport ステートメントを使用できるようになりました。

Cloud Run 関数内で ESM を使用するには、package.json 内で "type": "module" を宣言する必要があります。

{
  ...
  "type": "module",
  ...
}

これにより、import ステートメントと export ステートメントを使用できます。