Node.js ランタイム

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

関数の準備

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

サポートされている Node.js ランタイムとベースイメージ

ランタイム ランタイム ID スタック ランタイム ベースイメージ
Node.js 22 nodejs22
  • google-22(デフォルト)
  • google-22-full
  • google-22/nodejs22
  • google-22-full/nodejs22
  • Node.js 20 nodejs20
  • google-22(デフォルト)
  • google-22-full
  • google-22/nodejs20
  • google-22-full/nodejs20
  • Node.js 18 nodejs18
  • google-22(デフォルト)
  • google-22-full
  • google-22/nodejs18
  • google-22-full/nodejs18
  • Node.js 16 nodejs16 google-18-full google-18-full/nodejs16
    Node.js 14 nodejs14 google-18-full google-18-full/nodejs14
    Node.js 12 nodejs12 google-18-full google-18-full/nodejs12
    Node.js 10 nodejs10 google-18-full google-18-full/nodejs10
    Node.js 8 nodejs8 廃止 廃止
    Node.js 6 nodejs6 廃止 廃止

    ランタイムの選択

    デプロイ時に、関数にサポートされている Node.js ランタイムのいずれかを選択できます。

    ランタイム バージョンを選択するには、Google Cloud コンソールまたは gcloud CLI を使用します。使用するツールのタブをクリックして、手順を確認してください。

    gcloud

    関数をデプロイするときに、--base-image フラグを使用して関数の Node.js ベースイメージを指定します。次に例を示します。

    gcloud run deploy FUNCTION \
        --source . \
        --function FUNCTION_ENTRYPOINT \
        --base-image nodejs22
    

    次のように置き換えます。

    • FUNCTION: デプロイする関数の名前。このパラメータは省略できますが、省略すると名前の入力を求められます。

    • FUNCTION_ENTRYPOINT: ソースコード内の関数のエントリ ポイント。これは、関数の実行時に Cloud Run が実行するコードです。このフラグには、ソースコード内に存在する関数名または完全修飾クラス名を指定する必要があります。

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

    コンソール

    ランタイム バージョンは、Google Cloud コンソールで Cloud Run 関数を作成または更新するときに選択できます。関数のデプロイ手順については、Cloud Run で関数をデプロイするをご覧ください。

    関数を作成するときに Google Cloud コンソールでランタイムを選択する手順は次のとおりです。

    1. Google Cloud コンソールで [Cloud Run] ページに移動します。

      Cloud Run に移動

    2. [関数を作成] をクリックします。

    3. [ランタイム] リストで、Node.js ランタイム バージョンを選択します。

    4. [作成] をクリックし、Cloud Run がプレースホルダ リビジョンを使用してサービスを作成するのを待ちます。

    5. コンソールの [ソース] タブにリダイレクトされ、関数のソースコードが表示されます。[保存して再デプロイ] をクリックします。

    関数のデプロイ後にランタイム バージョンを更新する手順については、新しいソースコードを再デプロイするをご覧ください。

    ソースコードの構造

    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 モジュールの使用に関する記事をご覧ください。