Node.js ランタイム

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

関数の準備

関数は、 Google Cloud コンソールから直接準備することも、ローカルマシンで作成してアップロードすることもできます。Node.js 開発用にローカルマシンを準備するには、Node.js 開発環境を設定するをご覧ください。

ランタイムの選択

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

gcloud

Cloud Run functions を使用して gcloud CLI で HTTP 関数をデプロイするには、Google Cloud CLI を使用してデプロイするをご覧ください。

Console

Google Cloud コンソールを使用している場合は、関数を作成してデプロイするときにランタイムを選択します。詳しい手順については、Google Cloud コンソール クイックスタートをご覧ください。

ソースコードの構造

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 関数

// 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 関数には、ExpressJS と互換性のある request オブジェクトと response オブジェクトが用意されており、HTTP リクエストの使用が容易になっています。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 ステートメントを使用できます。

詳しくは、ES モジュールの使用に関する記事をご覧ください。