Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

アプリをCloudFunctionsEmulatorに接続します

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

Firebase プロジェクトを選択

Firebase Local Emulator Suite は、単一の 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 エミュレータとのやり取りを次のように構成します。

アンドロイド
// 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);
迅速
Functions.functions().useFunctionsEmulator(origin: "http://localhost:5001")

Web version 9

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

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

Web version 8

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

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

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

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

たとえば、デフォルトのホスト ポートとリージョンを使用した単純なhelloWorld関数は、次の場所で提供されます。

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

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

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

  • リアルタイム データベース エミュレータ
  • Cloud Firestore エミュレータ
  • 認証エミュレーター
  • Pub/Sub エミュレータ

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

拡張機能によって発行されたカスタム イベントのハンドラーをテストする

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 エミュレータに自動的に接続します。 「ローカル エミュレーター スイートの構成」で説明されているように、既定のポートを変更できます。

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

ハンドラー実行の詳細については、Emulator Suite UI で Functions ログを確認できます。

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

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

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

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

.env .env.dev .env.local
PLANET=地球

AUDIENCE=人間

AUDIENCE=開発者AUDIENCE=ローカル人間

ローカル コンテキストで起動すると、エミュレーターは次のように環境変数を読み込みます。

  $ 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 エミュレーターとの統合は提供されません。シェルを使用してデータをモックし、関数呼び出しを実行して、ローカル エミュレーター スイートが現在サポートしていない製品 (Analytics、Remote Config、および Crashlytics) との相互作用をシミュレートします。
  • 関数開発用の mocha フレームワークを備えた Node.js である、Cloud Functions 用の Firebase Test SDK。実際、Cloud Functions Test SDK は、Cloud Functions シェル上で自動化を提供します。

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

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

Cloud Functions エミュレーターは、ほとんどのユース ケースで実稼働環境にかなり近いものです。私たちは、Node ランタイム内のすべてが可能な限り本番環境に近いものになるように、広範な作業を行ってきました。ただし、エミュレーターは完全なコンテナー化された運用環境を模倣していないため、関数コードは現実的に実行されますが、環境の他の側面 (ローカル ファイル、関数クラッシュ後の動作など) は異なります。

クラウド IAM

Firebase Emulator Suite は、実行のために IAM 関連の動作を複製または尊重しようとはしません。エミュレーターは、提供されている Firebase セキュリティ ルールに準拠しますが、IAM が通常使用される状況では、たとえば、Cloud Functions 呼び出しサービス アカウントを設定してアクセス許可を設定する場合、エミュレーターは構成可能ではなく、開発者のマシンでグローバルに利用可能なアカウントを使用します。ローカル スクリプトを直接実行するのと同様です。

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

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

関数がエミュレータで実行される場合、関数の実行時間は製品とは異なる場合があることに注意してください。エミュレーターを使用して関数を設計およびテストした後、実稼働環境で限定的なテストを実行して実行時間を確認することをお勧めします。

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

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

Cloud Functions 開発用のローカル環境は、Google の実稼働環境とは異なる場合があることに注意してください。

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

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

再試行中

Cloud Functions エミュレーターは、失敗時の関数の再試行をサポートしていません。

次は何?