概要
GoodJobでは、Firestoreの東京リージョンへ移行しました。
というのも、この記事(Firestore東京リージョン利用に伴う Firebaseの移行手順 でのベンチマークの結果を見たのでした。
GoodJob のターゲットユーザーは日本の方のみなので、リージョン変更は必須でした。
オープンベータ版のリリースまでバリに住んでいて、変更しても直感的に有り難さ感じを感じられないのですが、帰国後を楽しみに移行してみました。
まだクローズドベータ版として、一部ユーザーのみに公開しているのみなので、主に考慮するべき点としてはユーザーにログインをやり直す必要があることを周知することのみでした。
もし、リリース後のアプリであれば、もう少し考慮点があると思うのですが、今回はそのような方向けには書けなさそうです… ごめんなさい。
なにをしたのか
Firestoreのリージョン変更 (us-central → asia-northeast1)に伴い、プロジェクトを再度作成しました。
*リージョン変更するには、プロジェクトを再度作成するしかありません。
それに伴い、Storage、Authのデータ、Firestoreのデータを移行したのが今回やったことになります。
Firebaseのリージョンを変更する
移行前後のプロジェクトで課金を有効にする。
Firestoreのエクスポート・インポートには、課金が必要です。
StorageとAuthのみであれば、課金前のプロジェクトでも移行することができました。
移行後のプロジェクトでFirestoreを有効にしておく
Firestoreをアクティベートしておきましょう。後々、インポートするときに、
ERROR: (gcloud.beta.firestore.import) FAILED_PRECONDITION: Project 'project_name' is not a Cloud Firestore enabled project
とエラーが出てしまいます。
Authデータを移行する
// set current project
firebase use {your_previous_project}
// export as users.json
firebase auth:export users.json --format json --project ${your_previous_project}
// import from users.json
firebase auth:import users.json --project ${your_previous_project}
Firestoreをエクスポートする
gcloud beta firestore export gs://{bucket_name_on_prev_pjt}
バケットの名前は、firebaseコンソール画面 の Storageから確認できます。
ここでやっていることは、firebaseプロジェクトに紐付けられているStorageに、Firestoreのバックアップをとっています。
ちなみに、firebaseのStorageと Google Cloud Storageって何が違うのかというと、実態は同じです。関係としては、Google Cloud Storageの方がWrapしています。
FirebaseのStorageをアクティブにしたタイミングで、Google Cloud Storageにバケットが作られます。このリージョンはプロジェクトのリージョンと同一のものが作成されるため、
移行前のプロジェクトではus-central、
移行後のプロジェクトではasia-northeast1
に作られることになりますね。
Storageを移行する
ここまでで、Authの以降は完了し、
移行前プロジェクトのStorageにはFirestoreのバックアップが入っているのでした。
gcloudコマンドラインツールを使って、Storageを移行します。
移行後のFirebaseプロジェクトのStorageには、移行前のデータとFirestoreのバックアップが入っています。
gsutil cp -r gs://{bucket_on_prev_pjt} gs://{bucket_on_current_pjt}
Firestoreをインポートする
移行後のプロジェクトでFirestoreをインポートします。
これで一通りの移行作業は完了しました。
// set current project
gcloud config set project {your_current_project_name}
// import from backup
gcloud beta firestore import gs://{your_current_pjt}/
{backup_folder}
Cloud Functionsのロケーションを変更する
Cloud Functionsもリージョナルです。
Cloud Functions側から呼びだすサービスのロケーションにもよるのですが、
私たちはFirestoreへの更新が主なこと、外部サービスで主に連携しているのがAlgoliaなど、ロケーションが東京にあるサービスだったので、Cloud Functionsのロケーションも東京 (asia-northeast1)にしています。
Cloud Functionsの変更方法
funcitonsに以下のように実装してあげて、デプロイすれば完了です。
参考: Cloud Functionsのロケーション からの引用です。
exports.myStorageFunction = functions
.region('europe-west1')
.storage
.object()
.onFinalize((object) => {
// ...
});
Storageのリージョンを変更する
Storageのデフォルトのロケーションは、プロジェクトを設定したときのものと同じになります。
なので、今回のチュートリアルの進め方通りにしているのであれば変更の必要はありません。
関連している外部サービスのリージョンを変更する
Cloud Functionsから使用している外部サービスのロケーションを変更します。
私たちの場合、パフォーマンスに影響が出そうな外部サービスはalgoliaがあったので、ホストロケーションを東京に変更しました。
algoliaのホスティングロケーションを変更する
algokiaのロケーションを変更するには、現在のところ運営側に依頼するしかないそうです。
そのため、algoliaのサポートセンターに連絡することで解決しました。
気をつけること
私自身よく忘れることで、移行の際の備忘録として書いておきます。
- 新規のプロジェクトに環境変数を設定する。