依存関係の扱い


関数では、ローカルデータだけでなく、外部の Node.js モジュールも使用できます。Node.js における依存関係は、npm で管理され、package.json というメタデータ ファイルで表現されます。Cloud Functions の Node.js ランタイムは、npmyarnpnpm を使用したインストールをサポートしています。

関数の依存関係を指定するには、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-adminfirebase-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() 関数を使用して、関数とともにデプロイするローカル ファイルをインポートすることもできます。

TypeScript で関数を記述する場合は、同じ方法で 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 ビルド環境変数を使用してデプロイ時にインストールをスキップします。

ベンダリングされた依存関係の前提条件

  1. ベンダー定義する関数(すべての依存関係を含み、機能している関数)が package.json ファイルにあることを確認します。

  2. 次のコマンドを実行して、これらの依存関係をローカルにインストールします。

        npm install
    
  3. 作業ディレクトリの .gcloudignore ファイルから node_modules を削除します。

  4. 関数をデプロイして、ローカルの Node.js のバージョンが、デプロイ時に指定したバージョンと同じであることを確認します。

  5. 次のコマンドを使用して、関数とベンダリングされた依存関係をデプロイします。

      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 ファイルから削除します。