FirestoreエミュレータにAdmin SDKで接続するときのメモ

FirestoreエミュレータにAdmin SDKで接続する際にひっかかったので、メモ残し。

目次

以前、Cloud Functions エミュレータからの接続は試していたので、それを参考にNode.jsサーバからアクセスしようとしたところ、うまく行かず

公式ドキュメントを見たところ、Cloud Functions エミュレータからのアクセスと、それ以外で違う模様

以下、Cloud Functionsエミュレータからの接続とそれ以外からの接続について、簡単にまとめ

Cloud Functionsエミュレータからの接続

Cloud Functionsエミュレータからの接続の場合、以下のように環境変数FIRESTORE_EMULATOR_HOSTでホストを指定するだけでOK。

export FIRESTORE_EMULATOR_HOST="localhost:8080"

Cloud Functionsエミュレータ以外からの接続

Cloud Functionsエミュレータ以外から接続する場合は、上記の環境変数FIRESTORE_EMULATOR_HOSTに加えてプロジェクトIDの指定が必要

指定方法は、以下のようにadmin.initializeAppの引数で指定するか、

admin.initializeApp({ projectId: "your-project-id" });

以下のように環境変数GCLOUD_PROJECTで指定するか

export GCLOUD_PROJECT="your-project-id"

補足 その1 - Firebase Emulator Suite でデータを確認したい場合は

公式ドキュメントによると

実際の Firebase プロジェクト ID を使用する必要はありません。Cloud Firestore エミュレータは、有効な形式である限り、どのようなプロジェクト ID でも受け入れます。

という事だけど、エミュレータの方で指定しているプロジェクトIDと異なるものを指定するとUI(Firebase Emulator Suite)でデータを確認できない。

UIでチェックしたい場合は、エミュレータで指定しているIDと同じに

逆にテストでは、デモ用のデータが壊れたりするとめんどうなので、エミュレータで指定しているIDとは異なるものにした方が無難そう

補足 その2 - プロジェクトIDの指定なしでもOK?

あれこれ試した感じだと、Cloud Functionsエミュレータ以外からの接続でもプロジェクトIDを指定しなくても動作していたような

※ 厳密には未確認

ただ、動作デモ用にはUIでデータチェックできた方が便利だし、テストではテストごとにプロジェクトIDを分けといた方が心配事が減りそうなので、必ず設定するようにした方が無駄に消耗しなくて済みそう

まとめ

Functionsエミュレータからの接続

  • 環境変数FIRESTORE_EMULATOR_HOSTを設定

Cloud Functionsエミュレータ以外からの接続

  • 環境変数FIRESTORE_EMULATOR_HOSTを設定
  • 環境変数GCLOUD_PROJECTadmin.initializeAppでプロジェクトIDを指定
    • Firebase Emulator Suite でデータを確認したい場合は、エミュレータで指定しているプロジェクトIDに合わせる