増え続けるFirestoreのデータをBigqueryへ保管
手順
- 0:00 Firestoreの該当コレクションを毎日cloud functionでcloud storageへexportする。完了したらlambdaを呼び出す。
- 1:00 lambdaで、cloud storageからbigqueryの一時テーブルへデータをバッチ取り込み(上書き)
- 2:00 lambdaで、bqの一時テーブルから指定した日のデータをメインテーブルへ追加
- 2:00 lambdaで、Firestoreの元データを削除
Bigqueryでのテーブル管理
1ヶ月ごとにテーブルを新規作成する
firestoreのエクスポート時の注意点:collection-idsを指定しないといけない
firestoreに1日分のログを書き込むことになるので、コストを試算する。
料金とか確認
そんなに高くなさそうなので全然あり。バッチ読み込みがコスト、パフォーマンス面でバランスがよさそう
バッチ読み込みは読み込みソースが限られる。
GCSにあるFirestoreエクスポートファイルを読み込むか、jsonファイル(これはGCSでなくてもよさげ)を読み込む方法が有力。
2つとも試したいが、Firestore エクスポートデータで済むならjsonの方法はいらないと思う。
bqでバッチ読み込み時にコレクションを指定して読み込めるが、コレクションを1つ指定してエクスポートしたデータのみが取り込めるため、既存の日時all-collectionsのバックアップデータは残念ながら取り込めないらしい。
注意
エクスポートは、エクスポート開始時に取得された正確なデータベース スナップショットではありません。エクスポートには、オペレーションの実行中に追加された変更が含まれる場合があります。
データのエクスポートをスケジュールする
エクスポート オペレーションには、エクスポート先の Cloud Storage バケットが必要です。
実際にfirestoreからbigqueryにデータを転送することができたが、注意点がある。
- firestoreからcloud storageにエクスポートする際に、cloud storageのリージョンは〜と〜が選択できるが、
- bigqueryに読み込むときは、該当データセットのロケーションとcloud storageのバケットのロケーションは同じでないといけない?
-
データセットは、エクスポート ファイルが格納される Cloud Storage バケットと同じリージョンまたはマルチリージョンのロケーションに存在する必要があります。
-
新しいテーブルを作成してデータを保存することも、既存のテーブルを上書きすることもできますが、既存のテーブルに Firestore エクスポート データを追加することはできません。
- 全てのロケーションを同じにしておくのが確実
実験時の状況
- Firestore:asia-southeast2
- cloud storage バケット:asia-southeast2
- asia-southeast2
Bigqueryにcloud storageからデータを読み込むときのドキュメント:
ハマりポイント
cloud functionのデプロイ時
- 環境変数のGCLOUD_PROJECTは手動で設定しなければならない(pythonやgolangだとデフォルトで設定されるらしいが、node.jsは違う)
- 実行関数名の指定を忘れないように。ドキュメントの手順にあるけど。
- cloud functionを実行するサービスアカウント(PROJECT_ID@appspot.gserviceaccount.com)に対して、適切な権限を付与する。これもドキュメントに書かれてるけど。
bigqueryではデータセット数、テーブル数ともに無制限