関数では、ローカルデータだけでなく、外部の Node.js モジュールも使用できます。Node.js における依存関係は、npm で管理され、package.json
というメタデータ ファイルで表現されます。Cloud Functions の Node.js ランタイムは、npm、yarn、pnpm を使用したインストールをサポートしています。
関数の依存関係を指定するには、package.json
ファイルにその依存関係を追加します。
この例では、依存関係は package.json
ファイルにリストされています。
{ "dependencies": { "escape-html": "^1.0.3" } }
依存関係は関数にインポートされます。
JavaScript
const escapeHtml = require('escape-html');
// Return a greeting with the input HTML-escaped.
exports.hello = functions.https.onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
});
TypeScript
import * as escapeHtml from 'escape-html';
// Return a greeting with the input HTML-escaped.
export let hello = functions.https.onRequest((req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
}
ローカル Node.js モジュールを含める
関数の一部としてローカルの Node.js モジュールを含めることもできます。そのためには、file:
接頭辞を使用してモジュールを package.json
で宣言します。次の例では、mymodule
はモジュール名を指し、mymoduledir
はモジュールを含むディレクトリを指します。
{ "dependencies": { "mymodule": "file:mymoduledir" } }
このローカル モジュールのコードは、関数のルート ディレクトリ内にある node_modules
フォルダ以外の場所に保存する必要があります。
TypeScript での追加手順
TypeScript は、型情報のあるライブラリを使用するときに役立ちます。これにより TypeScript で構文エラーを捕捉し、エディタでの予測入力機能を強化できます。firebase-admin
と firebase-functions
といった一部のライブラリには、TypeScript の定義が含まれています。
多くのライブラリは独自の TypeScript 定義を提供しません。DefinitelyTyped プロジェクトに、コミュニティで管理されている、よく使用されるノード ライブラリの定義が用意されています。DefinitelyTyped は、これらの定義を同じ NPM パッケージ名で公開していますが、名前に「@types」が含まれています。たとえば、uuid
ライブラリの型情報をインストールするには、次のコマンドを実行します。
npm install @types/uuid
TypeScript に慣れてきたら、次のように両方のインストールを組み合わせることもできます。
npm install uuid @types/uuid
型の依存関係は、ライブラリの依存関係と同じ種類でなければなりません。たとえば、通常の依存関係として uuid
を保存した場合、dev 依存関係またはピア依存関係として @types/uuid
を保存できません。
Node.js モジュールを読み込む
インストールされている任意の Node.js モジュールを読み込むには、Node.js の require()
関数を使用します。require()
関数を使用して、関数とともにデプロイするローカル ファイルをインポートすることもできます。
import
を使用し、インストール済みの Node.js モジュールを読み込みます。
非公開モジュールを使用する
非公開の npm モジュールを使用するには、関数のディレクトリにある .npmrc
ファイルに、レジストリを認証するための設定を記述します。パッケージ管理システムとして Yarn v2 以降を使用している場合、このファイルの名前は .yarnrc.yml
です。
Artifact Registry の非公開モジュール
Artifact Registry Node.js パッケージ リポジトリは、関数の非公開モジュールをホストできます。Google Cloud Functions の関数をデプロイすると、ビルドプロセスにより、Cloud Build サービス アカウント用の Artifact Registry 認証情報が自動的に生成されます。必要な操作は、.npmrc
に Artifact Registry リポジトリのリストを記述するだけです。追加の認証情報を生成する必要はありません。例:
@SCOPE:registry=https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
//REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME:always-auth=true
このアプローチは Yarn v1 パッケージ マネージャーでも機能します。
Yarn v2 以降を使用している場合は、追加の認証情報なしで Artifact Registry リポジトリを .yarnrc.yml
に一覧表示するだけで済みます。例:
npmScopes:
SCOPE:
npmRegistryServer: https://REGION_ID-npm.pkg.dev/PROJECT_ID/REPOSITORY_NAME
npmAlwaysAuth: true
他のリポジトリの非公開モジュール
npm のドキュメントでは、カスタムの読み取り専用アクセス トークンを作成する方法について説明しています。.npmrc
ファイルには読み取り / 書き込みトークンが含まれているため、ホーム ディレクトリにこのファイルを作成して使用することは避けてください。デプロイ時に書き込み権限は必要なく、セキュリティ上のリスクが発生する可能性があります。
非公開リポジトリを使用していない場合は .npmrc
ファイルを追加しないでください。追加すると、関数のデプロイ時間が長くなる可能性があります。
ファイル形式
.npmrc
ファイルを使用してカスタム認証トークンを設定する場合は、以下の行を含める必要があります。
//REGISTRY_DOMAIN/:_authToken=AUTH_TOKEN
以下のように置き換えます。
- REGISTRY_DOMAIN: 非公開 npm レジストリのドメイン名。リポジトリが
npmjs.org
でホストされている場合は、このフィールドをregistry.npmjs.org
に設定します。 AUTH_TOKEN: npm レジストリの認証トークン。トークンのリテラル テキスト値、または
npm
を環境の実際のトークン値に置き換えるテキスト文字列${NPM_TOKEN}
のいずれかになります。$NPM_TOKEN
環境変数と--set-build-env-vars
引数をgcloud functions deploy
コマンドに設定できます。NPM 認証トークンについて詳しくは、非公開モジュールに関する NPM のチュートリアルをご覧ください。
ベンダリングされた依存関係を使用して関数をビルドする
ベンダリングされた依存関係とは、ソースがソースコード パッケージに直接組み込まれ、独自のコードとともに再ビルドされる依存関係です。ベンダリングされた Node.js 依存関係を作成し、GOOGLE_VENDOR_NPM_DEPENDENCIES ビルド環境変数を使用してデプロイ時にインストールをスキップします。
ベンダリングされた依存関係の前提条件
ベンダー定義する関数(すべての依存関係を含み、機能している関数)が
package.json
ファイルにあることを確認します。次のコマンドを実行して、これらの依存関係をローカルにインストールします。
npm install
作業ディレクトリの .gcloudignore ファイルから
node_modules
を削除します。関数をデプロイして、ローカルの Node.js のバージョンが、デプロイ時に指定したバージョンと同じであることを確認します。
次のコマンドを使用して、関数とベンダリングされた依存関係をデプロイします。
gcloud functions deploy FUNCTION_NAME \ --runtime RUNTIME_NAME \ --set-build-env-vars GOOGLE_VENDOR_NPM_DEPENDENCIES=true
以下のように置き換えます。
- FUNCTION_NAME: デプロイする Cloud Functions 関数の名前
- RUNTIME_NAME: デプロイされた関数を実行する Node.js ランタイムの名前。これは、ローカル開発環境で使用したものと同じ Node.js バージョンである必要があります。
Functions フレームワーク パッケージは、関数に必須の依存関係です。ビルドを高速化するには、このパッケージをベンダリングすることをおすすめします。そうしない場合は、関数をビルドするときにダウンロードおよびインストールされます。
package.json ファイルで npm エンジンを指定すると、指定したバージョンの npm がビルド時間にダウンロードされます。この動作を抑制するには、package.json ファイルから削除します。