Firestoreのデータをgcloudを使ってバックアップ＆別のプロジェクトへインポートしてみる

Firestoreのデータをガリガリ見ていきたいなと思っていたら、
別のプロジェクトに移行できそうだったので、いろいろ調べたときの備忘録。

分析目的だけど、BigQueryは1000カラム制約で使えなかったので代替案...
別プロジェクトなら無料枠でいろいろできそう。

いろいろ試したけど、ダメだった経緯はこちらにまとめました。。
- [Firestoreのデータを分析するための3つの方法とその注意点 - Qiita](https://qiita.com/kira_puka/items/98283e837f30209f23c8)

### 注意

Firestoreのエクスポート/インポートについて、いくつか注意。

1. Firestoreのエクスポート/インポートは**Blazeプラン**が必要(無料枠では不可)
2. ドキュメントの読み取りと書き込み時にCloud Firestoreの料金が課金される

さらに、

> エクスポート / インポート オペレーションのコストは、**費用制限の対象にはなりません**。
> オペレーションが完了するまで、エクスポート/インポートでGCPの**予算アラートはトリガーされません**。

とのことなので、ご利用は計画的に..


---

### 1. gcloudのインストール

##### インストール

```console
$ brew cask install google-cloud-sdk
```

##### .bashrcなどに以下を追記

```bash
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.bash.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.bash.inc'
```

##### gcloudの初期化

```console
# 初期設定の実行
$ gcloud init
# このあと、ログイン画面が出てきて認証する

# コンポーネントのアップデート
$ gcloud components update

# 現在のプロジェクトの確認
$ gcloud info | grep project
```

### 2. FirestoreのデータをExportする

`firestore export`を使うと、データのバックアップが作成できるらしい。
バックアップデータはGCPのStorage上に作成されるので、
あらかじめ、Storageを作成しておく必要がある。


```console
# 現在のプロジェクトの確認
$ gcloud info | grep project

# 全体のエクスポート
$ gcloud beta firestore export gs://[BUCKET_NAME]

# コレクションを指定して、一部だけをエクスポート
$ gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]

# 実行状況の確認
$ gcloud beta firestore operations list
```

データ量が多いと、コマンドが途中で終了するので、
完了したかどうかは`operations list`を実行して確認する必要がある。



参考: [データのエクスポートとインポート  |  Firebase](https://firebase.google.com/docs/firestore/manage-data/export-import?hl=ja)

### 3. プロジェクトを変更する

```bash
# プロジェクトの設定
$ gcloud config set project [PROJECT]

# 現在の設定情報の確認
$ gcloud info
```

参考: [SDK 構成の管理  |  Cloud SDK のドキュメント  |  Google Cloud](https://cloud.google.com/sdk/docs/configurations)

### 4. アカウントを変更する

```console
# アカウントの設定
$ gcloud config set account [ACCOUNT]

# 設定したアカウントの認証
$ gcloud auth login

# 登録しているアカウントの一覧を確認
$ gcloud auth list

# プロジェクトの設定
$ gcloud config set project [PROJECT]

# 現在の設定情報の確認
$ gcloud info
```

参考: [Cloud SDK ツールの承認  |  Cloud SDK のドキュメント  |  Google Cloud](https://cloud.google.com/sdk/docs/authorizing)


### 5. バックアップを別のプロジェクトにインポートする

全体の流れはこんな感じ。

```console
# バックアップしたいプロジェクトに設定
$ gcloud config set project [PROJECT]

# 全体のエクスポート
$ gcloud beta firestore export gs://[BUCKET_NAME]


# 別のプロジェクトにプロジェクトに変更
$ gcloud config set project [PROJECT]

# バックアップファイルのインポート
$ gcloud beta firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/
```

**注意点**

1. インポートしたいプロジェクトのFirestoreは初期設定までする必要がある
2. 実行はプロジェクトのサービスアカウントで実行されるので、  
   バックアップファイルのバケットに権限を付与する必要がある

参考: [データのエクスポートとインポート  |  Firebase](https://firebase.google.com/docs/firestore/manage-data/export-import?hl=ja)

# おわりに

有料のみではあるけど、

1. 本番データの分析したり
2. 本番データを開発用に利用したり
3. プロジェクトの移行

なんかにも使えそう。
分析はBigQueryを使えるならそのほうがいいかも？


## こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました！
[積読ハウマッチ](https://tsundoku.site)は、Nuxt.js+Firebaseで開発してます!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/>

もしよかったら、遊んでみてくださいヽ(=´▽`=)ﾉ

要望・感想・アドバイスなどあれば、
公式アカウント([@MemoryLoverz](https://twitter.com/MemoryLoverz))や開発者([@kira_puka](https://twitter.com/kira_puka))まで

# 参考にしたサイト

- [データのエクスポートとインポート  |  Firebase](https://firebase.google.com/docs/firestore/manage-data/export-import?hl=ja)
- [Cloud Firestoreのバックアップ・リストア - google-cloud-jp - Medium](https://medium.com/google-cloud-jp/firestore-backup-67327a74cd54)
- [gcloudのアカウント変更とプロジェクト変更｜yo16｜note](https://note.mu/yo16/n/ne25615bab8f5)
- [自分用GCPコマンドリファレンス - Qiita](https://qiita.com/ShuA/items/1ff83b8d804168b087ba)
- [gcloudの自分用メモ - Qiita](https://qiita.com/Takakuwa-Shun/items/ac455c96a81a189eacce)
- [gcloudコマンド（GCP）で複数のプロジェクトとアカウントの使い分けを便利に - Adwaysエンジニアブログ](https://blog.engineer.adways.net/entry/2018/06/08/150000)
- [macosにgcloudとkubectlのインストール - Qiita](https://qiita.com/sakamossan/items/8ff74ed377dc77325b80)
- [macOS 用のクイックスタート  |  Cloud SDK のドキュメント  |  Google Cloud](https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja)