Open15

増え続けるFirestoreのデータをBigqueryへ保管

ピン留めされたアイテム
そららいどそららいど

手順

  1. 0:00 Firestoreの該当コレクションを毎日cloud functionでcloud storageへexportする。完了したらlambdaを呼び出す。
  2. 1:00 lambdaで、cloud storageからbigqueryの一時テーブルへデータをバッチ取り込み(上書き)
  3. 2:00 lambdaで、bqの一時テーブルから指定した日のデータをメインテーブルへ追加
  4. 2:00 lambdaで、Firestoreの元データを削除

Bigqueryでのテーブル管理

1ヶ月ごとにテーブルを新規作成する

そららいどそららいど

firestoreに1日分のログを書き込むことになるので、コストを試算する。

そららいどそららいど

バッチ読み込みがコスト、パフォーマンス面でバランスがよさそう
バッチ読み込みは読み込みソースが限られる。
GCSにあるFirestoreエクスポートファイルを読み込むか、jsonファイル(これはGCSでなくてもよさげ)を読み込む方法が有力。
2つとも試したいが、Firestore エクスポートデータで済むならjsonの方法はいらないと思う。
bqでバッチ読み込み時にコレクションを指定して読み込めるが、コレクションを1つ指定してエクスポートしたデータのみが取り込めるため、既存の日時all-collectionsのバックアップデータは残念ながら取り込めないらしい。

そららいどそららいど

実際にfirestoreからbigqueryにデータを転送することができたが、注意点がある。

  • firestoreからcloud storageにエクスポートする際に、cloud storageのリージョンは〜と〜が選択できるが、
  • bigqueryに読み込むときは、該当データセットのロケーションとcloud storageのバケットのロケーションは同じでないといけない?
  • データセットは、エクスポート ファイルが格納される Cloud Storage バケットと同じリージョンまたはマルチリージョンのロケーションに存在する必要があります。

  • 新しいテーブルを作成してデータを保存することも、既存のテーブルを上書きすることもできますが、既存のテーブルに Firestore エクスポート データを追加することはできません。

  • 全てのロケーションを同じにしておくのが確実

実験時の状況

  • Firestore:asia-southeast2
  • cloud storage バケット:asia-southeast2
  • asia-southeast2
そららいどそららいど

ハマりポイント

cloud functionのデプロイ時

  • 環境変数のGCLOUD_PROJECTは手動で設定しなければならない(pythonやgolangだとデフォルトで設定されるらしいが、node.jsは違う)
  • 実行関数名の指定を忘れないように。ドキュメントの手順にあるけど。
  • cloud functionを実行するサービスアカウント(PROJECT_ID@appspot.gserviceaccount.com)に対して、適切な権限を付与する。これもドキュメントに書かれてるけど。