Cloud Functions を新しい Node.js に移行する

このドキュメントでは、Cloud Functions コードの移行をサポートすることを目的として、Node.js ランタイム バージョン間の相違点について説明します。

新しいランタイムへの移行

新しいランタイムに移行するには:

  1. このドキュメントでターゲット ランタイムに関する説明を確認して、変更されている点を理解し、コードに必要な変更を加えてください。特に、Node.js 10 ランタイムで導入された環境変数の変更に注意してください。
  2. ターゲット Node.js ランタイムを指定して、関数をデプロイします。

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Node.js 14 ランタイムの相違点

Node.js 14 には、新しい機能とコンセプトが導入されています。要点:

  • オプション チェーン。オプション チェーンは {"hello": null}?.hello?.neat のようになります。これにより、存在しない可能性のあるオブジェクトのディープキーに安全にアクセスできます。
  • Null 合体。これにより ?? が導入されますが、(null または undefinedfalse としてのみ評価されるため)割り当てに || を使用する場合と比較して安全性が向上します。

Node.js 14 の機能の詳細については、こちらをご覧ください。

Node.js 12 ランタイムの相違点

Node.js 12 では npm ci が使用されます。これは、package.json 内で prepare スクリプトを常に実行します。

npm installnpm 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 ランタイムでは、datacontext プロパティが event オブジェクトから抽出され、関数の署名の一部として含まれています。

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

この変更により、以前は event 引数に含まれていた data オブジェクトと context オブジェクトの参照が簡単になりました。詳細については、バックグラウンド関数のパラメータをご覧ください。

Node.js 6 でバックグラウンド関数のシグネチャを使用している場合は、新しい Node.js ランタイムで関数を実行できるように以下の変更を行います。

  1. 関数のシグネチャを (event, callback) から (data, context, callback) に変更します。

  2. event.dataevent.context への参照を、それぞれ datacontext への参照に変更します。

非推奨: 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 は無効にされる可能性があります。