Firestoreコレクションをエクスポート／インポートで別プロジェクトに移行

#Firestoreコレクションをエクスポート／インポートで別プロジェクトに移行

ぜったい忘れる。備忘録。
ちなみにこの作業はバックアップ／リストアにも使える。

###下準備①
- 移行元プロジェクトと移行先プロジェクトをBlaze plan（従量課金制）にする。

###下準備②
- Google Cloud Shellにアクセスしておく。https://console.cloud.google.com/home/dashboard?cloudshell=true
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/8cf19e34-191e-6a0b-67b5-2368375d7d54.png)

- Cloud Shellで移行元プロジェクトにセットしておく。
- 
```bash
$ sudo gcloud components update
$ gcloud config set project [PROJECT_ID]
```
※ PROJECT_IDはコレ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f00b3007-7f90-a5a6-191e-e9fb1f50ad28.png)

###下準備③
- Google Cloud StorageのBucketを作成しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/16b1ac4f-3eb7-70b6-9479-802e2a409403.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/e0e45982-0126-553b-42bf-d204d50fa007.png)
RegionはFirebaseプロジェクトと同じにする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/f64d0d8e-b7c2-ef93-d9f2-5c079e92af82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/95ad7415-22f8-47c9-ea4e-8d6d109c331b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/97082827-01ec-7d57-e97a-51e37ad092fc.png)
そのまま作成ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/a03d8021-2f6d-958f-d31f-a39b20b8af23.png)


- 作成したバケットに自分をストレージ管理者として追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/2aa5d314-ae4a-ec9b-9f7b-addc56be50ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/378d2da2-1341-21fc-a0f2-66a9d8716c4c.png)


<br>
###移行元プロジェクトからエクスポート
以下Cloud Shellでの作業。
念のため移行元プロジェクトにもう一度セット。

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

コレクションを作成したバケットにエクスポート。

```bash
$ gcloud beta firestore export gs://[バケット名] --collection-ids [コレクション名]
```

複数の場合

```bash
gcloud beta firestore export gs://[バケット名] --collection-ids='[コレクション名]','[コレクション名]'
```

※ バックアップ目的なら--collection-idsパラメータはつけない方がいいようだ。

成功したかどうか以下のコマンドで確認。

```bash
gcloud beta firestore operations list
```
done: trueとかoperationState: SUCCESSFULとか表示されているはず。

```bash
$ gcloud beta firestore operations list
---
done: true
metadata:
  '@type': type.googleapis.com/google.firestore.admin.v1.ExportDocumentsMetadata
  collectionIds:
  - [collectonName]
  endTime: '2019-11-21T08:13:23.707922Z'
  operationState: SUCCESSFUL
  outputUriPrefix: gs://xxxxxxx.appspot.com/2019-11-21T08:13:11_53544
  startTime: '2019-11-21T08:13:11.909308Z'
name: projects/xxxxx/databases/(default)/operations/ASAxMDMxxxxxx
response:
  '@type': type.googleapis.com/google.firestore.admin.v1.ExportDocumentsResponse
  outputUriPrefix: gs://xxxxxx.appspot.com/2019-11-21T08:13:11_53544
---
```

バケット内に2018-08-09T01:58:11_44344みたいな名前のフォルダができているのが確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307441/1c4d8e06-75fe-53ba-c43f-76190067b4f9.png)


###移行先プロジェクトへインポート
- Cloud Shellで<strong>移行先プロジェクト</strong>にセットしておく。

```bash
$ sudo gcloud components update
$ gcloud config set project [PROJECT_ID]
```
PROJECT_IDはいわずもがな<strong>移行先プロジェクトのプロジェクトID</strong>。


- インポートコマンドを走らせる。

```bash
$ gcloud beta firestore import gs://[バケット名]/[バケット内のフォルダ名]
```
例えばこんな感じ

```bash
$ gcloud beta firestore import gs://collection_export_bucket/2019-10-19T08:11:39_12345/
```

たぶん以下のようなエラーが出る・・・

```bash
[Error] Error details: [移行先プロジェクト名]@appspot.gserviceaccount.com does not have storage.buckets.get access to commentsfaqs_bucket
```

まあ、そしたら [移行先プロジェクト名]@appspot.gserviceaccount.comというアカウント（サービスアカウントのようだ）をバケットの権限でストレージ管理者として追加してあげる。
そしてもう一度インポートコマンドを走らせる。


以下のコマンドで成功したことを確認して移行先プロジェクトに無事インポートできているはず。

```bash
$ gcloud beta firestore operations list
```

<br>



参考：
[Cloud Firestoreのバックアップ・リストア](https://medium.com/google-cloud-jp/firestore-backup-67327a74cd54)