ローカルでの関数の実行

Firebase CLI には、次のタイプの関数をエミュレートできる Cloud Functions エミュレータが含まれています。

  • HTTPS 関数
  • 呼び出し可能関数
  • タスクキュー関数
  • Firebase AuthenticationRealtime DatabaseCloud FirestoreCloud Storage、サポートされている Firebase アラート、Cloud Pub/Sub からトリガーされるバックグラウンド関数。

関数を本番環境にデプロイする前に、ローカルで実行してテストできます。

Firebase CLI をインストールする

Cloud Functions エミュレータを使用するには、まず Firebase CLI をインストールします。

npm install -g firebase-tools

ローカル エミュレータを使用するには、Cloud Functions が以下に依存している必要があります。

  • firebase-admin バージョン 8.0.0 以降。
  • firebase-functions バージョン 3.0.0 以降。

管理者の認証情報を設定する(省略可)

関数のテストにおいて、Firebase Admin SDK を介して Google API や他の Firebase API とやり取りするには、管理者の認証情報を設定しなければならない場合があります。

  • Cloud Firestore トリガーと Realtime Database のトリガーにはすでに十分な認証情報があるため、追加の設定は必要ありません
  • Firebase API(AuthenticationFCM など)、Google API(Cloud Translation や Cloud Speech など)といった他のすべての API では、このセクションで説明する設定手順が必要です。これは、Cloud Functions シェルと firebase emulators:start のいずれを使用している場合も当てはまります。

エミュレートされる関数の管理者認証情報を設定するには:

  1. Google Cloud コンソールの [サービス アカウント] ペインを開きます。
  2. [App Engine デフォルト サービス アカウント] が選択されていることを確認し、右側のオプション メニューで [キーを作成] を選択します。
  3. プロンプトが表示されたら、キーのタイプとして JSON を選択し、[作成] をクリックします。
  4. ダウンロードしたキーを参照するように Google のデフォルトの認証情報を設定します。

    Unix

    export GOOGLE_APPLICATION_CREDENTIALS="path/to/key.json"
    firebase emulators:start
    

    Windows

    set GOOGLE_APPLICATION_CREDENTIALS=path\to\key.json
    firebase emulators:start
    

上記の手順を完了すると、関数テストで Admin SDK を使用して Firebase API や Google API にアクセスできるようになります。たとえば、Authentication のトリガーをテストする場合は、エミュレートされる関数で admin.auth().getUserByEmail(email) を呼び出すことができます。

関数の構成を設定する(省略可)

カスタム関数の構成変数を使用している場合は、最初にローカル環境でカスタムの構成を取得するコマンドを実行します(functions ディレクトリ内で実行します)。

firebase functions:config:get > .runtimeconfig.json
# If using Windows PowerShell, replace the above with:
# firebase functions:config:get | ac .runtimeconfig.json

Emulator Suite を実行する

Cloud Functions エミュレータを実行するには、emulators:start コマンドを使用します。

firebase emulators:start

emulators:start コマンドは、ローカル プロジェクトで firebase init を使用して初期化したプロダクトに基づいて、Cloud Functions、Cloud Firestore、Realtime Database、Firebase Hosting のエミュレータを起動します。特定のエミュレータを起動する場合は --only フラグを使用します。

firebase emulators:start --only functions

エミュレータの起動後にテストスイートやテスト スクリプトを実行する場合は、emulators:exec コマンドを使用します。

firebase emulators:exec "./my-test.sh"

アプリを計測可能にしてエミュレータと通信する

エミュレータとやり取りするためにアプリを計測可能にするには、追加の構成が必要になる場合があります。

呼び出し可能関数用にアプリをインストルメント化する

プロトタイプとテストのアクティビティに呼び出し可能なバックエンド関数が含まれる場合、Cloud Functions for Firebase エミュレータとのやり取りを次のように構成します。

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val functions = Firebase.functions
functions.useEmulator("10.0.2.2", 5001)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFunctions functions = FirebaseFunctions.getInstance();
functions.useEmulator("10.0.2.2", 5001);
Swift
Functions.functions().useFunctionsEmulator(origin: "http://127.0.0.1:5001")

Web

import { getApp } from "firebase/app";
import { getFunctions, connectFunctionsEmulator } from "firebase/functions";

const functions = getFunctions(getApp());
connectFunctionsEmulator(functions, "127.0.0.1", 5001);

Web

firebase.functions().useEmulator("127.0.0.1", 5001);

HTTPS 関数のエミュレーション用にアプリを計測可能にする

コード内の各 HTTPS 関数は、次の URL 形式を使用してローカル エミュレータから実行されます。

http://$HOST:$PORT/$PROJECT/$REGION/$NAME

たとえば、デフォルトのホストのポートとリージョンが指定された単純な helloWorld 関数は、次の場所で実行されます。

https://localhost:5001/$PROJECT/us-central1/helloWorld

タスクキュー関数のエミュレーション用にアプリをインストルメント化する

エミュレータは、トリガー定義に基づいてエミュレートされたタスクキューを自動的に設定します。Admin SDK は、CLOUD_TASKS_EMULATOR_HOST 環境変数を介してエミュレータが実行されていることを検出すると、キューに登録されたリクエストをエミュレータに再ルーティングします。

本番環境で使用されるディスパッチ システムは、エミュレータに実装されているシステムよりも複雑であるため、エミュレートされた動作が本番環境を正確に反映するとは限りません。エミュレータ内のパラメータにより、タスクがディスパッチされて再試行されるレートの上限が指定されます。

バックグラウンドでトリガーされる関数のエミュレーション用にアプリをインストルメント化する

Cloud Functions エミュレータは、次のソースからバックグラウンドでトリガーされる関数をサポートします。

  • Realtime Database エミュレータ
  • Cloud Firestore エミュレータ
  • Authentication エミュレータ
  • Pub/Sub エミュレータ
  • Firebase アラート エミュレータ

バックグラウンド イベントをトリガーするには、Emulator Suite UI を使用してバックエンド リソースを変更します。または、プラットフォームの SDK を使用して、アプリまたはテストコードをエミュレータに接続します。

Extensions から出力されるカスタム イベントのハンドラをテストする

Cloud Functions v2 で Firebase Extensions カスタム イベントを処理するために実装された関数の場合、Cloud Functions エミュレータは Eventarc エミュレータとペアになることで Eventarc トリガーをサポートします。

イベントを出力する拡張機能のカスタム イベント ハンドラをテストするには、Cloud Functions エミュレータと Eventarc エミュレータをインストールする必要があります。

Eventarc エミュレータが走行している場合、Cloud Functions ランタイムは現在のプロセスで EVENTARC_EMULATOR 環境変数を localhost:9299 に設定します。EVENTARC_EMULATOR 環境変数が設定されている場合、Firebase Admin SDK は Eventarc エミュレータに自動的に接続します。デフォルト ポートは、Local Emulator Suite を構成するの説明に沿って変更できます。

環境変数が適切に構成されると、Firebase Admin SDK はイベントを Eventarc エミュレータに自動送信します。次に、Eventarc エミュレータは Cloud Functions エミュレータにコールバックし、登録済みのハンドラをトリガーします。

Emulator Suite UI で Functions のログを調べて、ハンドラの実行に関する詳細を確認できます。

他のサービスとのインタラクション

Emulator Suite には複数のエミュレータが含まれており、プロダクト間のインタラクションをテストできます。

Cloud Firestore

Firebase Admin SDK を使用して Cloud Firestore に書き込む関数がある場合、Cloud Firestore エミュレータが実行されていれば、この書き込みはエミュレータに送信されます。この書き込みによってさらに関数がトリガーされると、それらは Cloud Functions エミュレータ内で実行されます。

Cloud Storage

Firebase Admin SDK(バージョン 9.7.0 以降)を使用して Cloud Storage に書き込む関数がある場合、Cloud Storage エミュレータが実行されていれば、この書き込みはエミュレータに送信されます。この書き込みによってさらに関数がトリガーされると、それらは Cloud Functions エミュレータ内で実行されます。

Firebase Authentication

Firebase Admin SDK(バージョン 9.3.0 以降)を使用して Firebase Authentication に書き込む関数がある場合、Auth エミュレータが実行されていれば、この書き込みはエミュレータに送信されます。この書き込みによってさらに関数がトリガーされると、それらは Cloud Functions エミュレータ内で実行されます。

Firebase Hosting

Cloud Functions を使用して Firebase Hosting の動的コンテンツを生成する場合、firebase emulators:start はローカルの HTTP 関数をホスティングのプロキシとして使用します。

Firebase アラート

サポートされている Firebase アラート トリガーが 1 つ以上含まれているプロジェクトでは、エミュレータ UI に [FireAlerts] タブが表示されます。アラート トリガーをエミュレートするには:

  1. [FireAlerts] タブを開きます。このタブには、トリガーが関連付けられているアラートタイプが読み込まれたプルダウンに表示されます(たとえば、onNewFatalIssuePublished トリガーがある場合は、crashlytics.newFatalIssue が表示されます)。
  2. アラートタイプを選択します。フォームにはデフォルト値が自動的に入力されます。この値は編集できます。イベントのフィールドを編集できます(アラート イベントのその他の情報は、推測値、モック値、またはランダムに生成された値です)。
  3. [アラートを送信] を選択して、合成アラートを関数エミュレータに送信します。ロギングは、Firebase コンソールの [アラート](およびログ)で確認できます。

ロギング

エミュレータは関数からのログを実行中のターミナル ウィンドウにストリーミングします。関数内の console.log()console.info()console.error()console.warn() のステートメントからの出力がすべて表示されます。

次のステップ

Firebase Emulator Suite の完全な使用例については、テスト用クイックスタート サンプルをご覧ください。