13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Firestoreのバックアップを手動で取ってみよう

13
Posted at

こんばんは。PrAha Inc.のCEO兼エンジニアのdowannaです。

Firestoreのバックアップを取りたい

Firestoreにバッチ更新をかましたり、マイグレーションしたいときがありますよね。
万が一データを吹き飛ばした時に備えて、基本的にはFirestoreAPIを叩く自動スクリプト等で定期的にバックアップを取っておくわけですが、時には緊急対応のため、手動バックアップを取得したいときがありますよね。

というわけで今日は手動バックアップの取り方をば。

手順

  • GCP上にCloud storageバケットを作成する
  • Cloud shell起動
  • プロジェクトを選択
  • FirestoreのバックアップをExport
  • ロールバックするときはImport
  • 注意点

GCP上にCloud storageバケットを作成する

まずはGCPのCloud storageへ。適当にバケットを作成し、バケットidを控えておきます

Cloud shell起動

GCPコンソールの画面右上にこんなアイコンが見えるはずです。
image.png

左下の「Cloud shell」アイコンをタップして、シェルを起動しましょう

プロジェクトを選択

起動したシェルにこんなコマンドを打ち込んでみましょう。

gcloud config get-value project

これで現在シェルに使われているプロジェクトが分かります。
今のFirebaseはプロジェクトを作成すると裏側でGCPのプロジェクトも作成しているため、FirebaseのprojectIdは、そのままGCPでも使えます。

もし別のprojectを選択する場合は、このコマンドで指定しましょう。

gcloud config set project [PROJECT_ID]

FirestoreのバックアップをExport

さて、Firestoreのバックアップを取りましょう。

gcloud firestore export gs://[STORAGE_ID]/

storage-idには、先ほど控えたCloud storageのidを入力してください。
それ以降に何も指定しなければ、タイムスタンプを使ったディレクトリが作成されて、その配下にバックアップが保存されます。
何もオプションを与えなければ、これだけで全てのサブコレクションも含めてバックアップが取得されます。

これでFirestoreの手動バックアップ完了です。めちゃくちゃ簡単でしたね。

ロールバックするときはImport

もし何かバッチ処理やマイグレーションにしくじった場合は、こんなコマンドでロールバックできます。

gcloud firestore import gs://[STORAGE_ID]/[BUCKET_ID]
gcloud firestore import gs://hogehoge-project-id/2020-01-31T07:12:30_55688 // 例えばこんな感じ

ロールバックも簡単ですね!Firestore有難い!

注意点

ただしFirestoreのバックアップにはいくつか注意点があります。

バックアップ時の状態が完全に再現されるわけではない

FirestoreのexportはDocIdを保持し、そのDocIdを使って、更新対象を探します。
同じDocIdを持つドキュメントはバックアップデータに上書きされます。

裏を返すとexport後に新規作成したDocは、バックアップデータをimportした場合も残り続けます。

つまり、バックアップ時の状態が再現されるわけではありません。
例えばバックアップ後にゴミデータを作ってしまった場合、そのゴミデータはimport後も残り続けます。
なのでバックアップを取得する前にFirestoreへの本番アクセスを遮断しておくなど、ゴミの発生を予防しておきましょう。

Indexはexportファイルに含まれない

exportファイルにはindexが含まれないので、importするFirestoreプロジェクトのindex状態に依存します。バックアップ後にindexを変更/削除した場合は注意が必要です。

exportファイルは読みにくい

直接読む事はほぼ無いかと思いますが、exportされたファイルはutf8-LEでエンコードされていたり、なぜかlatin-1でエンコードされているので、無邪気に開こうとすると文字化けします。

例えばvimなら、exportファイルを開いた後に

:set fenc?

でエンコードを確認したり、iconv等でエンコードを変更する一手間がかかります。(変換しても化けてる事があるけど...)

iconv -f UTF-16LE -t UTF-8 [filename] > [new-filename]

それを回避するためのnpmパッケージが用意されているので、読みやすい形式(jsonとか)を希望する場合は、使ってみても良いかも。

CollectionIdを指定しないとBigQueryで読み込めない
gcloud firestore export gs://[STORAGE_ID]/

こんな感じで全てのサブコレクションも含めてexportしたバックアップは、BigQueryで読み込めません。

gcloud firestore import gs://[BUCKET_NAME]/ --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]

--collection-idsフラグを使ってコレクションを指定する必要があるみたいです。

Firestoreの公式ドキュメント

こちら

13
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?