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

アプリを Cloud Storage for Firebase エミュレータに接続する前に、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 構成をダウンロードする必要がないため、オフラインでも使いやすい

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

Android、Apple プラットフォーム、ウェブの各 SDK

次のように、Cloud Storage 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 storage = Firebase.storage
storage.useEmulator("10.0.2.2", 9199)
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseStorage storage = FirebaseStorage.getInstance();
storage.useEmulator("10.0.2.2", 9199);
Swift
Storage.storage().useEmulator(withHost: "127.0.0.1", port: 9199)

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

const { getStorage, connectStorageEmulator } = require("firebase/storage");

const storage = getStorage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  connectStorageEmulator(storage, "127.0.0.1", 9199);
} 

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

var storage = firebase.storage();
if (location.hostname === "localhost") {
  // Point to the Storage emulator running on localhost.
  storage.useEmulator("127.0.0.1", 9199);
} 

エミュレータを使用して Cloud Storage for Firebase イベントによってトリガーされる Cloud Functions をテストするために、追加の設定は必要ありません。Cloud Storage for Firebase と Cloud Functions のエミュレータの両方が実行されている場合、これらは自動的に連携します。

Admin SDK

環境変数 FIREBASE_STORAGE_EMULATOR_HOST が設定されている場合、Firebase Admin SDK は Cloud Storage for Firebase エミュレータに自動的に接続します。

export FIREBASE_STORAGE_EMULATOR_HOST="127.0.0.1:9199"

Cloud Functions エミュレータは Cloud Storage for Firebase エミュレータを自動的に認識するため、Cloud Functions と Cloud Storage for Firebase エミュレータの統合をテストする場合はこの手順を省略できます。Cloud Storage for Firebase の Admin SDK では、この環境変数が自動的に設定されます。

Admin SDK コードを別の環境で実行されている共有エミュレータに接続する場合は、Firebase CLI で設定したのと同じプロジェクト ID を指定する必要があります。プロジェクト ID を initializeApp に直接渡すか、GCLOUD_PROJECT 環境変数を設定することによって指定できます。

Node.js Admin SDK
admin.initializeApp({ projectId: "your-project-id" });
環境変数
export GCLOUD_PROJECT="your-project-id"

データのインポートとエクスポート

データベース エミュレータと Cloud Storage for Firebase エミュレータを使用すると、実行中のエミュレータ インスタンスからデータをエクスポートできます。単体テストまたは継続的インテグレーション ワークフローで使用するデータのベースライン セットを定義し、チーム間で共有するためにエクスポートします。

firebase emulators:export ./dir

テストでは、エミュレータの起動時にベースライン データをインポートします。

firebase emulators:start --import=./dir

シャットダウン時にデータをエクスポートするようにエミュレータに指示するには、エクスポート パスを指定します。または、--import フラグに渡されたパスをそのまま使用することもできます。

firebase emulators:start --import=./dir --export-on-exit

データのインポートとエクスポートのこれらのオプションは、firebase emulators:exec コマンドでも機能します。詳細については、エミュレータ コマンド リファレンスをご参照ください。

Cloud Storage for Firebase エミュレータと本番環境の違い

クライアント アプリのテストに関しては、Cloud Storage for Firebase エミュレータは Firebase API サーフェス領域について本番環境とほぼ一致しています。通常の Firebase SDK(ウェブ、Android、Apple プラットフォーム)との間で、すべての Firebase コマンドが動作するように想定されています。

ただし、サーバーサイド アプリのテストには制限があります。Firebase Admin SDK は Google Cloud API サーフェスを使用しますが、この API のすべてのエンドポイントがエミュレートされるわけではありません。原則として、クライアント SDK から実行できる操作(ファイルのアップロードと削除、メタデータの取得と設定)は実装されており Admin SDK から使用できますが、それ以外は実装されていません。実装されていない主な機能を以下に示します。

Google Cloud Storage との違い

Storage エミュレータを含む Cloud Storage for Firebase プロダクトは、Firebase アプリの開発に役立つストレージ オブジェクトに焦点を当てた、Google Cloud Storage(GCS)機能のサブセットです。Cloud Storage for Firebase は、GCS と次の点で異なります。

  • Cloud Storage for Firebase は現在、ストレージ バケットの作成、一覧表示、取得、削除で Bucket API をサポートしていません。
  • Google Cloud Storage Objects API では、copydeletegetinsertlistpatchrewriteupdate メソッドがサポートされています。

Cloud IAM

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

Pub/Sub 通知

Cloud Storage for Firebase エミュレータは Cloud Pub/Sub エミュレータと統合されないため、ストレージ オブジェクトの変更に関するチャネルまたは通知の作成はサポートされていません。Cloud Functions ストレージ トリガーを直接使用することをおすすめします。

バケットレベルのメタデータ

Cloud Storage for Firebase エミュレータは、ストレージ クラス、バケットレベルの CORS 構成、ラベル、保持ポリシーなど、バケットレベルの構成をサポートしていません。このサポートは今後改善される予定です。

次のステップ