狐好きぷろぐらまー

狐好きプログラマーのブログです。

Firebase Firestoreのバックアップの取り方【手動】(gcloud CLIを用いる)

以前Firestoreのバックアップの手動での取り方がググってもちょっとわからなかったところがあったので

備忘録としてまとめておきます。

前提条件

  • Sparkより上のプランに設定されている必要があります。(== Blazerプランを設定する必要がある. 2020/09/30現在)
  • FirestoreとFirestorageの権限を持っておく必要があります。

動作環境

確認した環境は以下の環境です。

   macOS Catalina
      バージョン10.15.6(19G2021)
   gcloud CLI
        Google Cloud SDK 312.0.0
        bq 2.0.61
        core 2020.09.25
        gsutil 4.53

手順

  1. gcloud CLIをインストール

    こちらのサイト( https://cloud.google.com/sdk/docs/quickstart?hl=ja )を参考にgloud SDKをインストールします。

    • gcloud CLIは gcloud SDKの一部
  2. インストールができたら、下記コマンドを実行し、バックアップを実行するアカウントでログインします。

    gcloud auth login

    上記コマンドを実行すると、ブラウザが開くのでログインしたいアカウントを選択するとログインできます。

  3. 下記コマンドでログインしているアカウントを確認します。

    gcloud auth list

    実行すると、下記の様な画面が表示されます。 gyazo.com

  4. 下記コマンドで、有効なSDK構成のプロパティのリストを表示します。

    gcloud config list

    上記コマンドを実行後、下記の様な内容が表示され、現在選択されているプロジェクトIDとアカウントを確認することが可能です。 gyazo.com

  5. 下記コマンドで、現在ログイン中のアカウントに紐づいているFirebaseのプロジェクト一覧が表示されるのでバックアップを取りたいプロジェクトであるか確認します。

    gcloud projects list

    下記コマンドで、対象のプロジェクトを設定することができます。

    gcloud config set project $project_id

    1つ前のコマンドで表示されたプロジェクトから設定したいプロジェクトのプロジェクトIDを$project_idに入力し、設定します。

    e.g.) project IDが「hogehoge」の場合のコマンドはgcloud config set project hogehoge です。

  6. 再度glocud config listで対象のプロジェクトが選択されているか確認します。

    対象のプロジェクトのStoregeにバケットを作成していない場合は下記手順を参考にbackup用のバケットを作成します。

    • Blazerプランの場合はCloud Storageのロケーションを選択することができた。Sparkプランで選択できない様になっていました。
  7. Firebase Consoleでバックアップ用のバケットを作成します。

    • 既に用意されている場合は飛ばしてください。

      gyazo.com リージョンはasiaを選択した。(どのリージョンが良いかは調査していない為、今度調査を行う。)

  8. 下記コマンドを実行し、現在のfirestoreのデータをエクスポート(backupを保存)します。

    gcloud firestore export $bucket_path

    • $bucket_pathは、作成したバケットのパスを入力してください。
      • バケット名がhogehoge-db-backupの場合は$bucket_pathはgs://hogehoge-db-backupです。
      • このパスはFirebaseのコンソールからコピーすることが可能です。 gyazo.com
  9. 実行すると、指定したバケットにfirestoreのドキュメントのバックアップが保存されます。 gyazo.com

    • バックアップしたfirestoreのドキュメントをインポートする場合は、下記のコマンドで実行できます。

    gcloud firestore import $buckup_baket_path

    • $buckup_baket_pathはインポートしたいバックアップのフォルダのパスを設定します。
      • 上記の画像に記載しているバックアップをインポートする場合のコマンドは、gcloud firestore import gs://xxxx-xxxx/2020-09-30T02:48:40_62280です。

上記でバックアップのエクスポートとインポートについては以上です。

インポート時の注意点

前述したFirestoreのドキュメントのインポートで反映される内容には一点気をつける点があります。

それはバックアップ後に追加されたドキュメントは削除されないということです。

バックアップ時に保存されているドキュメントは全てバックアップ時にフィールドなども戻る為そこは気にしなくても良いと思います。

文字だけだとわかりづらいので具体例を記載します。

usersコレクションに1つドキュメントがある状態でエクスポートします。

バックアップ時の状態 gyazo.com

この後、新しいドキュメントをusersコレクションに追加する。 gyazo.com

また、元々あったドキュメントに新しいフィールド'answer'を追加し、nameフィールドを変更します。 gyazo.com

この状態で、先ほどとったバックアップをインポートします。

インポート後は下記の様な状態になります。 gyazo.com

  • 画像を確認すると、バックアップ後に追加したドキュメントはそのまま残っています。

バックアップ後に追加したドキュメントの内容を添付します。 gyazo.com

  • バックアップ時に存在していた1つ目のドキュメントはバックアップ時に戻っていることが確認できます。

以上です。