以下は完全に自分用でメモ程度にまとめたものなので、詳細は公式ドキュメントまたは参考になった記事を参照されることをおすすめします。
経緯
本来の手順としてはざっくり以下のようなフローだが、
(移行元)Firestore → (移行元)Cloud Storage → (移行後)Cloud Storage → (移行後)Firestore
Cloud Storageに対してサービスアカウントがプロジェクト間をクロスするような形で運用することが想定される。実際にやってみたところ、移行元のCloud Storageにて移行先のサービスアカウントに対する権限の付与や、gcloudでの設定の切り替えが煩雑になってしまい手間取ってしまった。ついでにどのロールが必要になるのか試行錯誤しながらやったため時間がかかってしまった。( "Storage レガシー読み取り" が必要ってわからないよ…)
以下のようなフローで実施したことにより、ちょっとだけ楽ができた&自分にとってはわかりやすかったので備忘録として残しておきます。
(移行元)Firestore → (移行元)Cloud Storage → ローカルへダウンロード → (移行先)Cloud Storageへアップロード → (移行後)Firestore
Firebase/GCPコンソール上でもある程度は操作できますが、Google Cloud SDK(CLI)で作業しています。
1. 移行元プロジェクトでの手順
-
Cloud Storageにて、Firestoreのデータベースと同じリージョンでバケットを作成する
-
Google Cloud SDKで操作する際は、Firestoreで使用するサービスアカウントに次の権限が付与されるようにする
- Storage オブジェクト 管理者
- Storage レガシー バケット 読み取り
-
権限を付与したサービスアカウントのキーをダウンロードする
gcloud iam service-accounts keys create ~/path/to/key.json \ --iam-account=<your-serviceaccount@iam.gserviceaccount.com>
-
サービスアカウントを認証する
gcloud auth activate-service-account \ <your-serviceaccount@iam.gserviceaccount.com> \ --key-file=~/paht/to/key.json
-
認証したサービスアカウントをデフォルトプロジェクト・アカウントに設定
gcloud config set project <src-project-id> gcloud config set account <your-serviceaccount@iam.gserviceaccount.com>
-
Firestore → Cloud Storage にエクスポート
gcloud firestore export ` <エクスポート先バケット>/<エクスポートプレフィックス> ` --project=<src-project-id>
2. ローカルでの手順
-
Cloud Storageからローカルへ再帰的にダウンロード
gsutil -m cp -r ` <エクスポート先バケット>/<エクスポートプレフィックス> ` <ローカル保存先>
3. 移行先プロジェクトでの作業
-
移行先プロジェクト・サービスアカウントに切り替える
gcloud config set project <dest-project-id> gcloud config set account <your-serviceaccount@iam.gserviceaccount.com>
-
移行先プロジェクトでのサービスアカウントにCloud Storage, Firestoreの権限を付与する
- Storage オブジェクト 管理者
-
ローカルからCloud Storageへ再帰的アップロード
gsutil -m cp -r ` <ローカル保存先パス>\<エクスポートプレフィックス> ` <アップロード先バケット>
-
Firestoreでデータベース名
(default)
を作成しておく -
Cloud Storage から Firestore へインポート
gcloud firestore import ` <アップロード先バケット>/<エクスポートプレフィックス> ` --project=<dest-project-id>
なお、Firestoreへはデータベース名が (default)
でインポートされるが、任意のデータベース名を指定してインポートできるかは未確認
参考