📁

Firestoreで異なるリージョンへデータ移行

2024/12/30に公開

1度だけ移行できればOKな方向けの記事です。

遥か昔、FirestoreにはTokyoリージョンが無く、やむなくUSリージョンで作りました。
しかし、2019年にTokyoリージョンが出来て、レイテンシを考えるとやっぱりTokyoに移したくなり、今回5年越しに重い腰を上げて移行を行ったのでその記録です。
サービス停止が難しく、旧DBが更新されたら新DBも更新したい〜的な要求もあるかと思いますが、この記事はその要求には応えません。

方針

ワンタイムなのでなるべくパパッとやる。

前提

移行先FirestoreはFirebaseのコンソールから作っておく。

手順概要

  1. 移行元Firestore用のCloud Storageバケットと、移行先Firestore用 Cloud Storageバケットを用意。
  2. 移行元Firestoreから移行元Firestore用バケットへデータをエクスポート。
  3. 移行元Firestore用バケットから 移行先Firestore用バケットへデータをコピー。
  4. 移行先Firestore用バケットから移行先Firestoreへインポート。

手順詳細

例として下記の場合を示します。

firestore(nam5) -> cloud storage(us) -> cloud storage(asia) -> firestore(tokyo)

すべてCloud Shellで実行します。ワンタイムでOKなので。

移行元Firestore用のCloud Storageバケットと、移行先Firestore用 Cloud Storageバケットを用意

cloud storage(us)と、cloud storage(asia)を作ります。

# USリージョンのバケット作成
gsutil mb -p <YOUR_PROJECT_ID> -l us gs://sakamoto-firestore-us/

# Tokyoリージョンのバケット作成
gsutil mb -p <YOUR_PROJECT_ID> -l asia-northeast1 gs://sakamoto-firestore-tokyo/

移行元Firestoreから移行元Firestore用バケットへデータをエクスポート

firestore(nam5) -> cloud storage(us)へエクスポートします。
usersコレクションのみを移行します。

gcloud firestore export gs://sakamoto-firestore-us/users \
  --collection-ids="users" \
  --async

移行元Firestore用バケットから 移行先Firestore用バケットへデータをコピー

cloud storage(us) -> cloud storage(asia)へコピーします。

gsutil -m cp -r gs://sakamoto-firestore-us/users \
          gs://sakamoto-firestore-tokyo/users

移行先Firestore用バケットから移行先Firestoreへインポート

cloud storage(asia) -> firestore(tokyo)へインポートします。

gcloud firestore import gs://sakamoto-firestore-tokyo/users \
          --database=tokyo \
          --async

終わりに

Cloud Shellはパパっとやるのに最適ですね。
ローカルに環境作らなくていいので楽だな〜。

Discussion