以前にfistoreについて簡単にまとめた記事を作成しました。今回は、firestoreのセキュリティルールを検証するために、Firebase Local Emulator Suiteというツールセットを利用してローカル環境でfiresotoreを動かす環境を構築する方法について紹介します。

Firebase Local Emulator Suiteとは

Firebase Local Emulator Suiteは、Cloud Firestore、Realtime Database、Cloud Functions、Cloud Pub/Sub、Firebase Hosting を使用してアプリをローカルでビルドおよびテストするデベロッパー向けの高度なツールセットです。firebase Local Emulatore Suiteの公式には、以下の図が紹介されています。

Hosting、firestore、Pub/Sub、cloud functionsといったGCP-firebaseを利用した最近のアプリーケーション開発でよく利用する機能をエミュレートする機能が提供されています。今回は、firestoreのエミュレート機能を利用します。

firestoreをローカル起動するために必要なセットアップ

下記項目について、事前に実施しておいて下さい。

  • firebase-toolはインストール
  • gcloudコマンドのインストール

それではセットアップしていこうと思います。firebaseのセットアップが設定されていない方は、下記のコマンドで設定して下さい。

$ firebase init 

? Which Firebase CLI features do you want to set up for this folder? Press Space to select features, then Enter to confirm your choices. (Press <space> to selec
t, <a> to toggle all, <i> to invert selection)
❯◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
 ◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
 ◯ Emulators: Set up local emulators for Firebase features

選択肢が表示されたら、Firestore、Emulatorsを選択します。選択するには、スペースキーを押下します。表示通りにすすめていくとどのプロジェクトを利用かと問われると思いますので、お使いのプロジェクトIDを指定して下さい。

次にfirestoreのルールについては、どれを使うかと問われるので、ルールファイルがすでにあれば、それを利用して下さい。なければそのままエンターキーを押下すると”firestore.rules”というファイルが生成されます。

=== Firestore Setup

Firestore Security Rules allow you to define how and when to allow
requests. You can keep these rules in your project directory
and publish them with firebase deploy.

? What file should be used for Firestore Rules? (firestore.rules)

後は流れにそってセットアップします。

エミュレーターを起動する

下記コマンドエミュレーターを起動します。

$ firebase emulators:start 

デフォルトでfirestoreは、8080ポートを利用します。他のサービス等で利用している場合には、firestore.jsonファイルを変更します。下記例では、localhostの9000ポートを利用する例になります。HOSTの変更が必要な場合には、”host”というキーをポートと同じように追加して下さい。

{
・・・
  "emulators": {
    "firestore": {
      "port": "9000"
    }
  }
・・・
}

webアプリーケーションからローカルのfirestoreへ接続するには

下記のようにdbの設定をローカル環境へ設定します。下記例は、firestoreのエミュレータがデフォルトのポートを利用して起動した想定での設定例です。

// firestoreの設定
const db = firebase.firestore()
db.settings({
  host: 'localhost:8080',
  ssl: false
})
export default db

admin SDKを利用している環境でローカルのfirestoreへ接続するには

起動する際に環境変数を利用します。デフォルト設定でエミュレータを起動している場合には、「FIRESTORE_EMULATOR_HOST=”localhost:8080″」を指定します。この環境変数を参照して、アプリーケーションはローカルのエミュレータへ接続しにいきます。

稼働中のデータをローカルへ取り込む

firestoreのデータをexportする先は、2つあります。BigQueryを利用するパターンとCloud Storageを使うパターンです。今回は、Cloud Storageを利用するパターンを行います。下記例では、事前に作成し済みの「firestore-data-export-test」というストレージを使います。

データをエクスポートする

firestoreの内容をすべて、exportするにすべてのドキュメントをエクスポートするには、下記コマンドを利用します。

$ gcloud firestore export gs://firestore-data-export-test 

データをインポートする

バケットに出力したデータをインポートします。まずは、バケットに取得したデータをローカルにダウンロードします。下記例では、firestore-dataというディレクトリを作成し、そこにダウンロードしています。

$ mkdir firestore-data
$ gsutil cp -r gs://firestore-data-export-test/2020-09-11T04:14:37_87816 firestore-data/

下記のようにimportをして起動することでこのデータを利用して起動します。

$ firebase emulators:start --import=./firestore-data/2020-09-11T04:14:37_87816/ 

これでローカル環境にも同一のデータ構造が復元できたかと思います。これでようやくローカル環境にfiresotreのルールを検証できる環境が整いました。

firestoreのルールを検証する

環境が出来たのであとは必要な検証を行いましょう。

意外と簡単に環境構築ができました。firestoreのセキュリティルールについては、代表的なパターンがあるので、そちらは別で紹介しようと思います。お疲れ様でした。