アプリを Cloud Functions エミュレータに接続する

アプリを Cloud Functions エミュレータに接続する前に、Firebase Local Emulator Suite の全体的なワークフローを理解し、Local Emulator Suite のインストールと構成を行い、CLI コマンドを確認しておいてください。

Firebase プロジェクトを選択する

Firebase Local Emulator Suite は、1 つの Firebase プロジェクト向けにプロダクトをエミュレートします。

エミュレータを起動する前に CLI の作業ディレクトリで firebase use を実行し、使用するプロジェクトを選択します。または、各エミュレータ コマンドに --project フラグを渡すという方法もあります。

Local Emulator Suite は、実際の Firebase プロジェクトとデモ プロジェクトのエミュレーションに対応しています。

プロジェクト タイプ 特長 エミュレータでの使用
実際

実際の Firebase プロジェクトとは、(通常は Firebase コンソールで)自分で作成および構成したプロジェクトのことです。

実際のプロジェクトには、データベース インスタンス、ストレージ バケット、関数など、その Firebase プロジェクト用にセットアップしたリソースのライブリソースが含まれています。

実際の Firebase プロジェクトを使用する場合、対応しているプロダクトの一部またはすべてに対してエミュレータを実行できます。

エミュレートしていないプロダクトに関しては、アプリとコードはライブリソース(データベース インスタンス、ストレージ バケット、関数など)とやり取りします。

デモ

デモ Firebase プロジェクトには、実際の Firebase 構成がなく、ライブリソースもありません。これらのプロジェクトには通常、Codelab またはその他のチュートリアルを介してアクセスします。

デモ プロジェクトのプロジェクト ID には demo- という接頭辞が付いています。

デモ Firebase プロジェクトを使用する場合、アプリとコードはエミュレータのみとやり取りします。エミュレータが実行されていないリソースとアプリがやり取りしようとすると、コードは失敗します。

可能な限り、デモ プロジェクトを使用することをおすすめします。次のような利点があります。

  • Firebase プロジェクトを作成せずにエミュレータを実行できるため、セットアップが簡単である
  • エミュレートされていない(本番環境の)リソースを誤って呼び出しても、データが変更されたり、使用量がカウントされたり、課金が発生したりする可能性がないため、安全性が高い
  • インターネットにアクセスして SDK 構成をダウンロードする必要がないため、オフラインでも使いやすい

アプリをインストルメント化してエミュレータと通信する

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

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

Kotlin+KTX
// 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")

ウェブ向けのモジュラー API

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

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

ウェブ向けの名前空間付き API

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

バックグラウンドでトリガーされる関数のエミュレーション用にアプリを計測可能にする

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

  • Realtime Database エミュレータ
  • Cloud Firestore エミュレータ
  • Authentication エミュレータ
  • Pub/Sub エミュレータ

バックグラウンド イベントをトリガーするには、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 のログを調べて、ハンドラの実行に関する詳細を確認できます。

ローカルテスト環境を構成する

関数が dotenv ベースの環境構成に依存している場合は、ローカルテスト環境でこの動作をエミュレートできます。

ローカルの Cloud Functions エミュレータを使用する場合は、.env.local ファイルを設定することで、プロジェクトの環境変数をオーバーライドできます。.env.local の内容は、.env ファイルおよびプロジェクト固有の .env ファイルよりも優先されます。

たとえば、開発用とローカルテスト用にわずかに異なる値が含まれる 3 つのファイルを 1 つのプロジェクトに含めたとします。

.env .env.dev .env.local
PLANET=Earth

AUDIENCE=Humans

AUDIENCE=Dev Humans AUDIENCE=Local Humans

ローカル コンテキストで起動された場合、エミュレータが読み込む環境変数は次のようになります。

  $ firebase emulators:start
  i  emulators: Starting emulators: functions
  # Starts emulator with following environment variables:
  #  PLANET=Earth
  #  AUDIENCE=Local Humans

Cloud Functions エミュレータ内のシークレットと認証情報

Cloud Functions エミュレータは、機密性の高い構成情報の保存とアクセスを可能にするために、シークレットの使用をサポートします。デフォルトでは、エミュレータはアプリケーションのデフォルト認証情報を使用して、本番環境のシークレットにアクセスしようと試みます。CI 環境などの特定の状況では、権限の制限により、エミュレータがシークレット値にアクセスできない場合があります。

Cloud Functions エミュレータによる環境変数のサポートと同様に、.secret.local ファイルを設定してシークレット値をオーバーライドすることができます。これにより、実際のシークレット値にアクセスできない場合であっても、関数をローカルで簡単にテストできます。

Cloud Functions が存在することをテストするための他のツールについて

Cloud Functions エミュレータは、他のプロトタイプとテストツールによって補完されます。

  • Cloud Functions シェル。対話型の反復型関数のプロトタイピングと開発を可能にします。このシェルは、開発用に REPL スタイルのインターフェースを備えた Cloud Functions エミュレータを使用します。Cloud Firestore エミュレータまたは Realtime Database エミュレータとの統合は提供されていません。シェルを使用してデータをモックし、Local Emulator Suite が現在サポートしていないプロダクト(アナリティクス、Remote Config、Crashlytics)とのやり取りをシミュレートする関数呼び出しを実行します。
  • Cloud Functions 用の Firebase Test SDK(関数開発用の Mocha フレームワークを備えた Node.js)。実際、Cloud Functions Test SDK は Cloud Functions シェルの上に自動化機能を提供します。

Cloud Functions シェルと Cloud Functions Test SDK の詳細については、関数をインタラクティブにテストするCloud Functions の単体テストをご覧ください。

Cloud Functions エミュレータと本番環境の違い

大多数のユースケースで、Cloud Functions エミュレータは本番環境とほぼ同じ環境です。Google は、Node ランタイム内のすべてを可能な限り本番環境に近い状態にするために、さまざまな取り組みを進めてきました。それでもなお、エミュレータは完全にコンテナ化された本番環境の模倣にはならないため、関数コードは現実どおりに実行されますが、環境の他の部分(ローカル ファイルや、関数がクラッシュした後の動作など)は異なります。

Cloud IAM

Firebase Emulator Suite は、実行において IAM 関連の動作を複製せず、考慮もしません。エミュレータは指定された Firebase セキュリティ ルールに従いますが、IAM が通常使用される状況では(たとえば、Cloud Functions を呼び出すサービス アカウントの設定、つまりは権限の設定時)、エミュレータは構成できないため、開発マシンでグローバルに利用できるアカウントが使用されます。これは、ローカル スクリプトを直接実行するのと似た状況です。

メモリとプロセッサの制限事項

エミュレータは、関数に関するメモリやプロセッサの制限事項を適用しません。ただし、エミュレータは timeoutSeconds ランタイム引数による関数のタイムアウト処理をサポートしています。

関数がエミュレータで実行される場合、関数の実行時間は本番環境とは異なることがあります。エミュレータを使用して関数を設計、テストした後、本番環境で制限付きのテストを実行して実行時間を確認することをおすすめします。

ローカル環境と本番環境の相違点に対する計画

エミュレータは、ローカルマシン上で実行されるため、アプリケーションおよび、組み込みプログラムとユーティリティについてはローカル環境に依存します。

Cloud Functions で開発を行うためのローカル環境は、Google の本番環境と異なる場合があることに注意してください。

  • 本番環境をシミュレートするためにローカルにインストールするアプリケーション(このチュートリアルの ImageMagick など)は、動作が本番環境とは異なることがあります(特に、異なるバージョンが必要な場合や、Linux 以外の環境で開発する場合)。関数のデプロイとともに、存在しないプログラムの独自のバイナリコピーをデプロイすることを検討してください。

  • 同様に、特に Linux 以外の環境(macOS など)で開発を行っている場合、組み込みユーティリティ(例: lsmkdir などのシェルコマンド)は、本番環境で利用可能なバージョンとは異なることがあります。この問題に対処するには、ネイティブ コマンドの代用となる Node 限定のコマンドを使用するか、Linux バイナリをビルドしてデプロイにバンドルします。

再試行

Cloud Functions エミュレータは、エラーになった場合の関数の再試行をサポートしていません。

次のステップ