sachaos.md
----------

# Firestore の特定のコレクションを BigQuery にシュッとロードするスクリプト

このエントリーをはてなブックマークに追加

## モチベーション

  • Firestore のデータを BigQuery にロードしたい
  • 恒久的に転送する必要があれば Firebase Extensions を使うが、一時的な分析を行うために BigQuery に転送したい。

## tl;dr

手でやっていくと少し面倒なのでスクリプトを書きました。

```sh
#!/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

## 流れ

  1. Firestore のバックアップを格納する GCS バケットを作成する
  2. Firestore の Admin 機能でバックアップを取る
  3. BigQuery にロードする

## 操作

### Project ID やバケット、対象のコレクションIDのセット

```sh
export PROJECT_ID=foo
export BUCKET_NAME=bar
export COLLECTION_ID=hoge
```

### Firestore のバックアップを格納する GCS バケットを作成する

```sh
gsutil mb -p $PROJECT_ID gs://${BUCKET_NAME}/
```

https://cloud.google.com/storage/docs/creating-buckets?hl=ja#storage-create-bucket-gsutil

### Firestore から GCS バケットにデータをエクスポートする

```sh
gcloud firestore export gs://${BUCKET_NAME}/ --project $PROJECT_ID
```

https://cloud.google.com/firestore/docs/manage-data/export-import?hl=ja

### BigQuery に GCS バケットからロードする

```sh
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

## まとめ

こういう作業って、たまにしかやらないので忘れちゃうんですよね。

スクリプト化してちゃんと管理していこう。 他にも同じタスクをやる人は多いだろうし公開しよう。

ということで、レポジトリも作成しました。

https://github.com/sachaos/scripts

このエントリーをはてなブックマークに追加