📁
Firestoreで異なるリージョンへデータ移行
1度だけ移行できればOKな方向けの記事です。
遥か昔、FirestoreにはTokyoリージョンが無く、やむなくUSリージョンで作りました。
しかし、2019年にTokyoリージョンが出来て、レイテンシを考えるとやっぱりTokyoに移したくなり、今回5年越しに重い腰を上げて移行を行ったのでその記録です。
サービス停止が難しく、旧DBが更新されたら新DBも更新したい〜的な要求もあるかと思いますが、この記事はその要求には応えません。
方針
ワンタイムなのでなるべくパパッとやる。
前提
移行先FirestoreはFirebaseのコンソールから作っておく。
手順概要
- 移行元Firestore用のCloud Storageバケットと、移行先Firestore用 Cloud Storageバケットを用意。
- 移行元Firestoreから移行元Firestore用バケットへデータをエクスポート。
- 移行元Firestore用バケットから 移行先Firestore用バケットへデータをコピー。
- 移行先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