Cloud Firestore の import / export やってみた

Firebase の import / export 機能がきたので、実際に試してみました。
[Export and import data  \|  Firebase](https://firebase.google.com/docs/firestore/manage-data/export-import)

流れとしては以下のようになります。

* gcloud のコマンドを使って Cloud Storage に export データを保存
* import も Cloud Storage にあるデータを Firestore に復元

所感としては、いい感じに動いてそうです。

## 事前準備

[Before you begin](https://firebase.google.com/docs/firestore/manage-data/export-import#before_you_begin)

* Blaze plan でないと import / export は利用できない
* export 用の Storage Bucket を作成
* Firestore, Cloud Storage の権限が適切か確認

Storage Bucket はこんな感じで作りました。

![スクリーンショット 2018-08-09 10.33.58.png](https://qiita-image-store.s3.amazonaws.com/0/5678/4137b323-2131-b3f5-015d-e593e29babee.png)

## gcloud 設定

[Set up gcloud for your project](https://firebase.google.com/docs/firestore/manage-data/export-import#set_up_gcloud_for_your_project)

GCP 管理画面から Shell を起動し、下記コマンドを打ちます。

```
gcloud config set project [PROJECT_ID]
```

Shell の起動はここからできます。

![スクリーンショット 2018-08-09 11.40.50.png](https://qiita-image-store.s3.amazonaws.com/0/5678/1db94150-eaed-d3f7-4bb5-f870d3d70eaa.png)

### Google Cloud SDK のセットアップ

これはローカルでやります。
私は macOS なので https://cloud.google.com/sdk/docs/quickstart-macos から 64bit のを DL してセットアップしました。
基本的に手順通りにやれば良いのですが、 alpha は別途 install が必要です。

```
$ gcloud components list
│ Not Installed  │ gcloud Alpha Commands                                │ alpha                    │   < 1 MiB │
```

デフォルトで aplha は利用できないので、 install して update します

```
$ gcloud components install alpha
$ gcloud components update
```

これで `gcloud alpha firestore …` が利用できるようになります。

## export

[Export all documents](https://firebase.google.com/docs/firestore/manage-data/export-import#export_all_documents)

全件 export をしてみます。

```
$ gcloud alpha firestore export gs://firestore-export
Waiting for [projects/hoge/databases/(default)/operations/XxxxXxXXXxXXXXxXXXXXXXXXXxxxxxxxx] to finish...done.
metadata:
  '@type': type.googleapis.com/google.firestore.admin.v1beta1.ExportDocumentsMetadata
  operationState: PROCESSING
  outputUriPrefix: gs://firestore-export/2018-08-09T02:15:18_53592
  startTime: '2018-08-09T02:15:18.310360Z'

```

Storage を見てみると、このようなデータが作成されていました。

![スクリーンショット 2018-08-09 11.53.16.png](https://qiita-image-store.s3.amazonaws.com/0/5678/9a1da0eb-deba-06db-6fa5-767aa7f0424a.png)

output-0 から大量のファイルができています。これがバックアップファイルのようです。

## import

[Import all documents from an export](https://firebase.google.com/docs/firestore/manage-data/export-import#import_all_documents_from_an_export)

先ほど export したデータを import します。
id が同一だとエラーになるので、一度全てのデータを削除して import しました。

```
$ Waiting for [projects/hoge/databases/(default)/operations/XxxxXxXXXxXXXXxXXXXXXXXXXxxxxxxxx] to finish...done.
metadata:
  '@type': type.googleapis.com/google.firestore.admin.v1beta1.ImportDocumentsMetadata
  inputUriPrefix: gs://firestore-export/2018-08-09T01:55:07_9048
  operationState: PROCESSING
  startTime: '2018-08-09T02:22:25.225520Z'
name: projects/hoge/databases/(default)/operations/XxxxXxXXXxXXXXxXXXXXXXXXXxxxxxxxx
```

Firestore の console をみると、 sub-collection 含めデータが復元されていました。

全てのデータのチェックはできないので完全かは不明ですが、ざっくり見た感じ問題はなさそうでした。
(import したデータを再度 export したら output ファイルの数が変わっていたので少し気になりますが)

Project A で export したものを Project B に import も試しましたが、問題なく実行されました。

## export されたファイル

export されたファイルを BigQuery につっこめないかと思ったんですが難しそうです。
JSON 形式などなら良かったんですが、 vi で開くとこのようになっていました。

![スクリーンショット 2018-08-09 12.07.51.png](https://qiita-image-store.s3.amazonaws.com/0/5678/cd58b1bf-8c02-e5ec-e574-04e9e90923af.png)

そのため、 backup 専門の用途として使うべきでしょう。