EY-Office ブログ

Firebaseのリージョン移設に手間取った

新たに自分専用Web記事保存アプリの開発を始めた で書いた WebArchives(Web記事保存アプリ)はバックエンドに Firebase を使っています。 しかし、開発を始めた時点で Firebase のリージョン(ロケーション)に東京があるに気が付かず us-central にバックエンドを作ってしまいました。利用する度にUSのサーバーを使うので反応が悪い気がします。

一度使い出してしまうとリージョンを変更する事はできません、有料プランに移行するとデータを export/import するツールが使えるようですが無料プランでは使えません。そこで export/import するツールを作り自力でリージョンを移行する事にしました。

簡単なツールを作れば移行出来ると思ったのですが、思いの外苦労しました ^^);

Firebase

発生した問題

Firebase APIが使える言語としては Java(Android), Swift(iOS), C++, C#(Unty), JavaScript(Web, Node.js) があります。
一度使ったら終わりのツールなので、手軽にコードが書けるJavaScript(Node.js)を選びました。

XMLHttpRequest is not defined

まずデータベース(Cloud Firestore)をexportするツールを書き、起動すると XMLHttpRequest is not defined というエラーが発生しました。 え!

バックエンドとの通信部分は Firebase API の内部にありますが、FirestoreのAPIは通信にXMLHttpRequestを使っているようです。FirebaseのJavaScript APIは Node.js には完全には対応してないです、FirebaseのドキュメントのサンプルコードにはNode.jsが在るのですが・・・

解決策は Firebase GitHubのIsuue にありましたが、Firebaseの完成度の低さを感じる問題でした。

Cloud Firestore の Datastore モード

いつからかCloud Firestoreは Firebase自身のDatabase の他に、Google Cloud Datastoreを直接利用出来るようになりました。しかしデフォルトが Google Cloud Datastore なので Cloud Firestore にテーブルが作れず混乱しました。

Oops, collections failed to load!

Google Cloud Platform のAPIを有効にしないと行けない。解答は StackOverflow に書かれてました。

Cannot convert firestore.v1.Value with type unset

すいません、詳細は忘れました m(_ _)m

データ転送量制限

フリープランでは 1Gbyte / 日 の制限があるので開発中にリミットに達してしまう事がありました。これはしょうがないですね。

まとめ

今回のツールはTypeScriptを使って書いてみました。VSCodeで型定義が判るのでデータの詳細な形式や、そのオブジェクトが持つメソッドが調べられ開発効率が良かったです。

参考までにコードは Gist に置いておきました。

結局早くなったのか?

今回、東京リージョンに移設して大きなPDFのデータのダウンロード時間は 30% 程度はやくなりました。

しかし、Firebaseにアクセスしデータベース(Cloud Firestore)を取得するにかかる時間は初回と2回目でかなり変わります。 2回3回と実行すると、us-centralリージョンと東京リージョンでは 8%程度しか高速化されませんでした。

ただし、アプリを使ってみた感覚では早くなったように感じます。1回目のアクセスで時間がかかるケースが減ったのかもしれません。

- about -

EY-Office代表取締役
・プログラマー
吉田裕美の
開発者向けブログ