Cloud Functions を新しい Node.js に移行する
このドキュメントでは、Cloud Functions コードの移行をサポートすることを目的として、Node.js ランタイム バージョン間の相違点について説明します。
新しいランタイムへの移行
新しいランタイムに移行するには:
- このドキュメントでターゲット ランタイムに関する説明を確認して、変更されている点を理解し、コードに必要な変更を加えてください。特に、Node.js 10 ランタイムで導入された環境変数の変更に注意してください。
ターゲット Node.js ランタイムを指定して、関数をデプロイします。
gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...
Node.js 14 ランタイムの相違点
Node.js 14 には、新しい機能とコンセプトが導入されています。要点:
- オプション チェーン。オプション チェーンは
{"hello": null}?.hello?.neat
のようになります。これにより、存在しない可能性のあるオブジェクトのディープキーに安全にアクセスできます。 - Null 合体。これにより
??
が導入されますが、(null
またはundefined
はfalse
としてのみ評価されるため)割り当てに||
を使用する場合と比較して安全性が向上します。
Node.js 14 の機能の詳細については、こちらをご覧ください。
Node.js 12 ランタイムの相違点
Node.js 12 では npm ci
が使用されます。これは、package.json
内で prepare
スクリプトを常に実行します。
npm install
と npm ci
の使用に関する主な相違点は次のとおりです。
- プロジェクトに既存の
package-lock.json
またはnpm-shrinkwrap.json
が必要です。 - パッケージ ロックの依存関係が
package.json
に存在する依存関係と一致しない場合、npm ci
はパッケージ ロックを更新せず、エラーで終了します。 node_modules
がすでに存在する場合は、npm ci
がインストールを開始する前に自動的に削除されます。
Node.js 10 から Node.js 12 にアップグレードするには、prepare
で使用されている依存関係を devDependencies
から dependencies
に移動します。
Node.js 12 以降の場合、メモリの上限が 2 GiB を超える関数では、max_old_space_size
を持つように NODE_OPTIONS
を構成する必要があります。次に例を示します。
gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http
Node.js 10 ランタイムの相違点
Node.js 10 ランタイムにおける変更が原因で、新しいランタイムを使用するためには関数のソースコードの修正が必要になる場合があります。
ほとんどのアプリケーションでは、Node 8 から Node 10 へのアップグレードでコードが変更されることはありません(主な違いは GCF の環境変数の変更)。
Node 10 では、非同期イテレータや Promise ベースのファイル API など、さまざまな新機能が導入され、パフォーマンスが向上し、セキュリティ パッチが適用されます。
ロギング
Node.js 8 でオブジェクトやコレクションをロギングするときに JSON.stringify
を使用していなかった場合は、Node.js 10 へのアップグレード時にログボリュームが増加する可能性があります。これにより、追加の費用が発生する可能性があります。ログの作成、表示、処理で説明されているように、JSON.stringify
を使用してログ ステートメントをグループ化することをおすすめします。
環境変数の変更
Node.js 10 ランタイムでは、ランタイムによって事前定義される環境変数が変更されています。Node.js 10 ランタイムで設定される環境変数と、以前のランタイムで設定される環境変数との違いの詳細については、自動設定される環境変数をご覧ください。
Node.js 10 ランタイム(およびそれ以降)で古い Node.js 関数を実行するには、使用している事前定義済みの環境変数の変更が必要になる場合があります。可能な場合は代わりの変数を使用するようにコードを更新するか、関数のデプロイ時に変数をご自分で設定してください。明示的に設定していない環境変数には依存しないようにすることをおすすめします。
以下の環境変数は、Node.js 10 ランタイムでは設定されなくなりました。
環境変数 | 移行 |
---|---|
CODE_LOCATION |
関数のデプロイ時に設定してください。コードの場所は /srv です。 |
ENTRY_POINT |
代わりに FUNCTION_TARGET 環境変数を使用してください。 |
GOOGLE_CLOUD_PROJECT |
関数のデプロイ時に設定してください。 |
GCP_PROJECT |
関数のデプロイ時に設定してください。 |
GCLOUD_PROJECT |
関数のデプロイ時に設定してください。 |
GOOGLE_CLOUD_REGION |
関数のデプロイ時に設定してください。 |
FUNCTION_REGION |
関数のデプロイ時に設定してください。 |
FUNCTION_NAME |
代わりに K_SERVICE 環境変数を使用してください。 |
FUNCTION_IDENTITY |
関数のデプロイ時に設定してください。 |
FUNCTION_MEMORY_MB |
関数のデプロイ時に設定してください。 |
FUNCTION_TIMEOUT_SEC |
関数のデプロイ時に設定してください。 |
FUNCTION_TRIGGER_TYPE |
代わりに FUNCTION_SIGNATURE_TYPE 環境変数を使用してください。使用方法の詳細については、環境変数の使用をご覧ください。 |
OLDPWD |
使用できなくなりました。 |
SHLVL |
使用できなくなりました。 |
Node.js 8 ランタイムの相違点
Node.js 6 ランタイムから Node.js 8 ランタイムへのバージョンアップに伴い、バックグラウンド関数のシグネチャが変更され、その変更は Node.js 10 にも適用されています。
Node.js 6 バックグラウンド関数の例を次に示します。
exports.nodejs6BackgroundFunction = (event, callback) => {
let data = event.data;
let context = event.context;
// ... the rest of your function
};
なお、event
引数には、data
プロパティと context
プロパティが含まれています。Node.js 10 ランタイムでは、data
と context
プロパティが event
オブジェクトから抽出され、関数の署名の一部として含まれています。
exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
// ... the rest of your function is unchanged
};
この変更により、以前は event
引数に含まれていた data
オブジェクトと context
オブジェクトの参照が簡単になりました。詳細については、バックグラウンド関数のパラメータをご覧ください。
Node.js 6 でバックグラウンド関数のシグネチャを使用している場合は、新しい Node.js ランタイムで関数を実行できるように以下の変更を行います。
関数のシグネチャを
(event, callback)
から(data, context, callback)
に変更します。event.data
とevent.context
への参照を、それぞれdata
とcontext
への参照に変更します。
非推奨: Node.js 6 と Node.js 8
Node.js 6 ランタイムと Node.js 8 ランタイムは非推奨になりました。サポートされているバージョンの Node.js で関数を使用するために、Node.js 10 以降に移行してください。
2020 年 8 月 5 日以降、Node.js 6 を使用した関数のデプロイはブロックされます。その後も Node.js 6 を使用し続ける Cloud Functions は無効にされる可能性があります。