はじめに
こんにちは、nukkyです。
今回は、実際に使用しているFirestoreの本番用のルール設定の話と、Firestoreのデータのdumpや、restoreを簡単に行える fsrpl を紹介したいと思います。
Firestoreのルール設定
Firestoreのルールとは、データベースへのセキュリティルールを定め、アクセス制御を行うことが出来る機能です。
全て許可
1 2 3 4 5 6 7 8 9 | rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } } |
Firestore作成時や開発時などはこちらのルールになっていると思います。
1 2 3 4 | service cloud.firestore { match /databases/{database}/documents { } } |
この記述で、Firestoreのデータベースのルートを表しており、その中にルールを記述していきます。
1 | match /{document=**} { |
{document=**} のワイルドカード表記によって、このパス以降の全てのドキュメントを対象にルールが適用されます。
ですので、上の記述、match /{document=**} だと全てのドキュメントが対象になっています。
ルールの基本的な書き方は、以下の通りです。
1 | allow <許可する読み書きのオペレーション>: if <許可する条件>; |
つまり、例の記述である以下のルールだと、
1 | allow read, write: if true; |
read (get, list)と write (create, update, delete)を常に許可という記述になります。
このように、ドキュメントのパスに対してルールを設定していきます。
本番環境でのルール設定例
例えばログインしているユーザーへの読み書きを許可する場合は、以下のようにします。
1 2 3 4 5 6 7 | service cloud.firestore { match /databases/{database}/documents { match /board/{thread} { allow read, write: if request.auth != null; } } } |
request.auth が null でなければログインしているとみなし、read と write の許可を出しています。
ユーザー同士がアクセスしあい、共有化されているドキュメントなら上記でもいいかもしれませんが、ユーザーが自分のデータのみを読み書きしたい場合は以下の様に設定します。
1 2 3 4 5 6 7 8 | service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read, update, delete: if request.auth != null && request.auth.uid == userId; allow create: if request.auth != null; } } } |
パスの中に{}で囲っている箇所がありますが、これは変数として使用することができます、
1 | allow read, update, delete: if request.auth != null && request.auth.uid == userId; |
この場合、ログインしておりパスの{userId}に当たる箇所がユーザーのuidと一致している場合は読み込み、更新、削除が許可されます。
今まで write で記述していたのを分けたのは二つ目のルールのためです。
1 | allow create: if request.auth != null; |
初回のアクセス時など、users 以下にドキュメントがない場合に作成許可を出すため、create は ログインしていれば許可としています。
fsrpl
私も大変お世話になっている、Firestoreの運用に便利な fsrpl (Firestore Replication Tool) の使い方を解説していきます。
fsrplとは
公式にも記載されていますが fsrpl はシンプルに以下の3つの機能があります。
-
copy
特定のドキュメントを、別のCollection配下にコピーできる。また、ワイルドカードを利用することでコレクション配下のすべてのドキュメントをコピーできる。- さらに、特定のProjectのFirebaseから他のFirebaseへ、特定のドキュメントのデータをコピーできる
-
dump
特定のドキュメントをローカルのJSONファイルとしてバックアップができる。 -
restore
ローカルのJSONファイルからドキュメントを復元できる。firestore emulator
へもデータの復元ができるため、テストデータ作成にも利用できる
インストール
今回は homebrew を使ってインストールします。
1 2 | $ brew tap matsu0228/homebrew-fsrpl $ brew install fsrpl |
秘密鍵
fsrpl を使用するにはFirestoreの秘密鍵が必要になります。
サービス アカウント用の秘密鍵ファイルを生成するには、
- Firebase コンソールで、[設定] > [サービス アカウント] を開きます。
- [新しい秘密鍵の生成] をクリックし、[キーを生成] をクリックして確定します。
- キーを含む JSON ファイルを保管します。
取得した秘密鍵は、下記いずれかの方法で指定できます
- 環境変数
FSRPL_CREDENTIALS
に、秘密鍵のPATHを指定する方法 - CLIのオプション
--cred
で、秘密鍵のPATHを指定する方法
copy
特定のドキュメントをコピーするために、 copy コマンドを利用します。
1 2 3 4 5 | fsrpl copy [コピー元のドキュメントを指定] --dest [コピー先のドキュメントを指定] e.g. fsrpl copy "inputData/user" --dest "new/user" |
FSRPL_CREDENTIALS
にPATHを通していない場合は、以下の様に指定します。
1 | fsrpl copy --cred **秘密鍵のPATH** "inputData/user" --dest "new/user" |
また、ワイルドカード
*
の指定ですべてのドキュメントをコピーできます。
1 | fsrpl copy "inputData/*" --dest "outputData/*" |
開発環境から、本番環境へコピーする
開発環境と本番環境の秘密鍵があれば、CLIのオプション
--dest_cred
で、コピー先の秘密鍵のPATHを指定することで環境をまたいでコピーすることが出来ます。
1 | fsrpl copy --cred **コピー元の秘密鍵のPATH** --dest_cred **コピー先の秘密鍵のPATH** "inputData/user" --dest "inputData/user" |
dump
dump することで、ドキュメントからローカルJSONファイルとしてデータをバックアップすることができます。
1 2 3 4 5 6 | fsrpl dump [コピー元のドキュメントを指定] --path [バックアップファイルを保存するディレクトリを指定] e.g. fsrpl dump "inputData/user" --path ./ fsrpl dump "inputData/*" --path ./ |
restore
restore は、dump でバックアップしたJSONファイルを使用してデータを復元することができます。
1 2 3 4 5 | fsrpl restore [コピー元のドキュメントを指定] --path [復元対象のJSONファイルを指定] e.g. fsrpl restore "importData/*" --path "./" |
さいごに
fsrpl はめちゃくちゃ便利なので、使ったことのない方はぜひ使ってみてください。