Node.js ランタイム

Cloud Functions は、次の Node.js ランタイムをサポートしています。

  • Node.js 20
  • Node.js 18(推奨)
  • Node.js 16
  • Node.js 14
  • Node.js 12
  • Node.js 10

Node.js 関数をローカルで実行する方法については、Functions Framework を使用して関数を実行するをご覧ください。

Cloud Functions で Node.js を使い始めるには、クイックスタートをご覧ください。

ランタイムの選択

デプロイ時に、関数に必要な Node.js ランタイムを選択できます。

gcloud

Google Cloud CLI を使用している場合は、--runtime パラメータを使用してランタイムを指定できます。次に例を示します。

gcloud functions deploy NAME --runtime nodejs20 --trigger-http

デプロイ時に指定できるその他の引数については、gcloud ツールを使用したデプロイをご覧ください。

コンソール

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

実行環境

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

Node.js バージョン 18 ランタイムは、Ubuntu 22.04 ベースの実行環境を使用します。バージョン 18 より前の Node.js ランタイムは、Ubuntu 18.04 に基づいています。詳しくは、Cloud Functions の実行環境をご覧ください。

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

ソースコードの構造

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

依存関係の指定

関数の依存関係は 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 Functions では、HTTP リクエストを単純にするために、ExpressJS との互換性がある request オブジェクトと response オブジェクトが提供されます。Cloud Functions ではリクエストボディが自動的に読み取られるため、常にコンテンツ タイプから独立したリクエストボディを受け取ります。つまり、HTTP リクエストはコードの実行時までに完全に読み取られているものと想定されています。ExpressJS アプリをネストする際は、この点に注意する必要があります。特に、リクエストの本文が読み取られていないことを想定しているミドルウェアは、想定どおりに動作しない可能性があります。

ES モジュールの使用

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

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

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

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