Firestore の特定のコレクションを BigQuery にシュッとロードするスクリプト
## モチベーション
- Firestore のデータを BigQuery にロードしたい
- 恒久的に転送する必要があれば Firebase Extensions を使うが、一時的な分析を行うために BigQuery に転送したい。
## tl;dr
手でやっていくと少し面倒なのでスクリプトを書きました。
#!/bin/bash
#
# Load data to BigQuery from Firestore Collection
PROJECT_ID=${PROJECT_ID:?is required}
BUCKET_NAME=${BUCKET_NAME:?is required}
COLLECTION_ID=${COLLECTION_ID:?is required}
TABLE=${TABLE:?is required}
LOCATION_ID=$( gcloud app describe --project $PROJECT_ID --format json | jq -r .locationId )
gsutil mb -p $PROJECT_ID -l $LOCATION_ID gs://${BUCKET_NAME}/
gcloud firestore export gs://${BUCKET_NAME}/ --collection-ids=${COLLECTION_ID} --project $PROJECT_ID
OUTPUT_URI_PREFIX=$(gcloud firestore operations list --project $PROJECT_ID --format json | jq -r ".[-1].response.outputUriPrefix")
bq load \
--project_id $PROJECT_ID \
--source_format=DATASTORE_BACKUP \
$TABLE \
$OUTPUT_URI_PREFIX/all_namespaces/kind_${COLLECTION_ID}/all_namespaces_kind_${COLLECTION_ID}.export_metadata
https://github.com/sachaos/scripts/blob/master/gcp/bq-load-from-firestore.sh
## 流れ
- Firestore のバックアップを格納する GCS バケットを作成する
- Firestore の Admin 機能でバックアップを取る
- BigQuery にロードする
## 操作
### Project ID やバケット、対象のコレクションIDのセット
export PROJECT_ID=foo
export BUCKET_NAME=bar
export COLLECTION_ID=hoge
### Firestore のバックアップを格納する GCS バケットを作成する
gsutil mb -p $PROJECT_ID gs://${BUCKET_NAME}/
https://cloud.google.com/storage/docs/creating-buckets?hl=ja#storage-create-bucket-gsutil
### Firestore から GCS バケットにデータをエクスポートする
gcloud firestore export gs://${BUCKET_NAME}/ --project $PROJECT_ID
https://cloud.google.com/firestore/docs/manage-data/export-import?hl=ja
### BigQuery に GCS バケットからロードする
OUTPUT_URI_PREFIX=$(gcloud firestore operations list --project $PROJECT_ID --format json | jq -r ".[-1].response.outputUriPrefix")
bq load \
--project_id $PROJECT_ID \
--source_format=DATASTORE_BACKUP \
$TABLE \
$OUTPUT_URI_PREFIX/all_namespaces/kind_${COLLECTION_ID}/all_namespaces_kind_${COLLECTION_ID}.export_metadata
https://cloud.google.com/bigquery/docs/loading-data-cloud-firestore?hl=ja
## まとめ
こういう作業って、たまにしかやらないので忘れちゃうんですよね。
スクリプト化してちゃんと管理していこう。 他にも同じタスクをやる人は多いだろうし公開しよう。
ということで、レポジトリも作成しました。