Node.js ランタイム
Cloud Run 関数は、オペレーティング システムのバージョンに加えて、アドオン パッケージ、言語サポート、お使いの関数をサポートして呼び出す Functions Framework ライブラリで構成される環境で実行されます。この環境は言語バージョンで識別され、ランタイムとして知られています。
ランタイムに関する一般的な情報と、各 Node.js ランタイムが使用する Ubuntu のバージョンについては、Cloud Run 関数の実行環境をご覧ください。
Node.js で Cloud Run 関数のビルドとデプロイを開始するには、クイックスタートをご覧ください。
ローカル システムで関数をビルドおよびテストするには、Functions Framework を使用して関数を実行するをご覧ください。
ランタイムを選択する
Cloud Run 関数は、ランタイム サポートのページに記載されている複数のバージョンの Node.js をサポートしています。デプロイ時に、関数に求められる Node.js ランタイムを選択できます。
Google Cloud CLI からのデプロイの詳細については、Google Cloud CLI を使用してデプロイするをご覧ください。
Google Cloud コンソールからのデプロイについて詳しくは、Google Cloud コンソールのクイックスタートをご覧ください。
実行環境
実行環境には、ランタイム、オペレーティング システム、パッケージ、関数を呼び出すライブラリが含まれます。
Node.js 18 およびそれ以降のバージョンでは、Ubuntu 22.04 に基づく実行環境を使用します。Node.js 18 より前のバージョンは Ubuntu 18.04 に基づいています。詳しくは、Cloud Run 関数の実行環境をご覧ください。
関数を呼び出すライブラリは Node.js Functions Framework です。
ソースコードの構造
Cloud Run 関数で関数の定義を見つけられるよう、ランタイムごとに、ソースコードの構造に対する特定の要件があります。詳細については、Cloud Run 関数の作成をご覧ください。
依存関係を指定する
関数の依存関係は package.json
ファイルに指定します。詳しくは、Node.js での依存関係の指定をご覧ください。
NPM ビルド スクリプト
デフォルトでは、package.json
で build
スクリプトが検出されると、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
ミドルウェアを使用して HTTP リクエストを処理する
Node.js HTTP Cloud Run 関数では、HTTP リクエストを単純にするために、ExpressJS との互換性がある request
および response
オブジェクトが提供されます。Cloud Run 関数ではリクエスト本文が自動的に読み取られるため、受け取るリクエスト本文は常にメディアタイプと独立です。つまり、HTTP リクエストはコードの実行時までに完全に読み取られているものと想定されています。ExpressJS アプリをネストする際は、この点に注意する必要があります。特に、リクエスト本文が読み取られていないと想定しているミドルウェアは、想定どおりに動作しない可能性があります。
ES モジュールを使用する
ECMAScript モジュール(ES モジュールまたは ESM)は Node 14 以降の TC39 の標準でフラグ付けなしの機能で、JavaScript モジュールの読み込みに使用されます。ESM は、CommonJS とは異なり、モジュールを読み込むための非同期 API を提供します。また、構文も改善されています。Cloud Run 関数の中で require
ステートメントの代わりに import
と export
ステートメントを使用できるようになりました。
Cloud Run 関数内で ESM を使用するには、package.json
内で "type": "module"
を宣言する必要があります。
{
...
"type": "module",
...
}
これにより、import
ステートメントと export
ステートメントを使用できます。