2022/04/23
Firebase CLIなしでFirestoreをローカル環境のテストで利用する
はじめに
Google Cloudで提供されているフルマネージドでスケーラブルなサーバーレスのNoSQLデータベースであるCloud Firestore(以下、Firestore)をローカル環境のテストで利用する方法を紹介します。
Firestoreには無料枠もあるので、ローカル環境のテスト時もクラウド上のFirestoreに接続することも可能ですが、FirestoreのデータベースはGoogle Cloud/Firebaseの1プロジェクトに対して1つだけになるため、複数人でテストする際にお互いにデータを上書きしたりしないようデータ構造を工夫する必要があります。このような問題を解決するため、ローカル環境でFirestore相当のものが起動できるエミュレーター環境が公式で提供されています。
エミュレーター環境を利用するためにはFirebase CLIかgcloud CLIを使う必要があります。Firebase CLIを使った方法はネット上にたくさんあるので、本記事ではgcloud CLIを使った方法をとりあげます。
Firestoreエミュレーターの起動方法
gcloud CLIが利用可能になっている必要があります。セットアップがまだの場合は、下記の公式ドキュメントを参考に初期設定まで完了しておいてください。
https://cloud.google.com/sdk/docs/install?hl=ja
https://cloud.google.com/sdk/docs/initializing?hl=ja
Firestoreエミュレーターの実行には上記のgcloud CLIに加えJavaの実行環境が必要なため、OpenJDKなどのJava実行環境をインストールしてください。実行環境のみでコンパイラ等は不要なため、JREとJDKの2つが選択可能な場合はJREの方で構いません。
Javaの実行環境が準備できたらターミナルを開いて下記コマンドを実行してエミュレーターを起動します。
1 | $ gcloud beta emulators firestore start |
初回はエミュレーターのコンポーネントのインストール処理が自動で動きだすので走るので画面にそって進み、いったん終了します。次に下記のとおりポート番号指定のオプション付きで実行します(8080番ポートが使用中の場合は適宜変更してください)。「Dev App Server is now running.」と表示されたら、起動は成功です。ポート番号指定のオプションを指定するのは後述の環境変数に指定が必要で、未指定だと空いているポートが自動で使われてしまい、扱いが面倒になるためです。
1 2 3 4 5 6 7 8 9 10 11 | $ gcloud beta emulators firestore start --host-port localhost:8080 Executing: /opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/platform/cloud-firestore-emulator/cloud_firestore_emulator start --host=localhost --port=8080 [firestore] Apr 22, 2022 2:18:44 PM com.google.cloud.datastore.emulator.firestore.websocket.WebSocketServer start [firestore] INFO: Started WebSocket server on ws://localhost:49385 [firestore] API endpoint: http://localhost:8080 [firestore] If you are using a library that supports the FIRESTORE_EMULATOR_HOST environment variable, run: [firestore] [firestore] export FIRESTORE_EMULATOR_HOST=localhost:8080 [firestore] [firestore] Dev App Server is now running. [firestore] |
プログラムからの利用方法
Node.js向けのサーバー クライアント ライブラリを使ってFirestoreに接続する下記のJavaScript プログラムをエミュレーターにつなぐ方法を説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const {Firestore} = require('@google-cloud/firestore'); const firestore = new Firestore(); function add() { firestore.collection('col1').add({'f1': 100, 'f2': 'abc'}); } async function get() { (await firestore.collection('col1').get()).docs.forEach(data => { console.log(data.id); console.log(data.data()); }); } console.log(process.env.FIRESTORE_EMULATOR_HOST); add(); get(); |
エミュレーターを使うにあたって、ソースコードの修正は不要です。環境変数FIRESTORE_EMULATOR_HOSTにホスト名、起動しているポート番号を指定しておけば、あとは勝手にエミュレーターのほうに接続してくれます。実際に実行してみると下記のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 | ~/D/firestore_local ❯❯❯ FIRESTORE_EMULATOR_HOST=localhost:8080 node index.js localhost:8080 ~/D/firestore_local ❯❯❯ FIRESTORE_EMULATOR_HOST=localhost:8080 node index.js localhost:8080 X9kRWO1f80arqCIyCjiV { f1: 100, f2: 'abc' } ~/D/firestore_local ❯❯❯ FIRESTORE_EMULATOR_HOST=localhost:8080 node index.js localhost:8080 7i6e52OPy54nwIjas7jM { f1: 100, f2: 'abc' } X9kRWO1f80arqCIyCjiV { f1: 100, f2: 'abc' } |
複数回実行すると、直前の実行時にFirestoreに書き込んだデータが引き継がれていることがわかると思います。
1点注意事項があり、Firebase CLIからエミュレーターを起動した場合にはWebコンソール画面からデータが目視で確認できたり、データのエクスポート/インポートする機能がありますが、これらの機能はgcloud CLIでは現在のところ提供されてないようです。今後のバージョンアップに期待しましょう。
まとめ
- gcloud CLIだけでも一部機能制限ありますがFirestoreエミュレーターは利用できます。このためだけにFirebase SDKのセットアップする必要はありません。
- プログラムから接続する場合は、環境変数を1つ設定するだけ。コードの修正は不要なので、積極的に活用していきましょう
Author Profile
ARIKAWA
バックエンドエンジニアです。 自転車が好きです。
SHARE