Stream Firestore to BigQuery
Made by Firebase
Sends realtime, incremental updates from a specified Cloud Firestore collection to BigQuery.
- Works with
- Cloud Firestore
- Version
- 0.1.56 | Source code
- License
- Apache-2.0
- Publisher
- Firebase
- Report
- Bug
- Abuse
How this extension works
Use this extension to export the documents in a Cloud Firestore collection to BigQuery. Exports are realtime and incremental, so the data in BigQuery is a mirror of your content in Cloud Firestore.
The extension creates and updates a dataset containing the following two BigQuery resources:
- A table of raw data that stores a full change history of the documents within your collection. This table includes a number of metadata fields so that BigQuery can display the current state of your data. The principle metadata fields are
timestamp
,document_name
, and theoperation
for the document change. - A view which represents the current state of the data within your collection. It also shows a log of the latest
operation
for each document (CREATE
,UPDATE
, orIMPORT
).
Warning: A BigQuery table corresponding to your configuration will be automatically generated upon installing or updating this extension. Manual table creation may result in discrepancies with your configured settings.
If you create, update, or delete a document in the specified collection, this extension sends that update to BigQuery. You can then run queries on this mirrored dataset.
Note that this extension only listens for document changes in the collection, but not changes in any subcollection. You can, though, install additional instances of this extension to specifically listen to a subcollection or other collections in your database. Or if you have the same subcollection across documents in a given collection, you can use {wildcard}
notation to listen to all those subcollections (for example: chats/{chatid}/posts
).
Enabling wildcard references will provide an additional STRING based column. The resulting JSON field value references any wildcards that are included in ${param:COLLECTION_PATH}. You can extract them using JSON_EXTRACT_SCALAR.
Partition
settings cannot be updated on a pre-existing table, if these options are required then a new table must be created.
Note: To enable partitioning for a Big Query database, the following fields are required:
- Time Partitioning option type
- Time partitioning column name
- Time partiitioning table schema
- Firestore document field name
Clustering
will not need to create or modify a table when adding clustering options, this will be updated automatically.
Additional setup
Before installing this extension, you’ll need to:
Import existing documents
There are two ways to import existing Firestore documents into BigQuery - the backfill feature and the import script.
To import documents that already exist at installation time into BigQuery, answer Yes when the installer asks “Import existing Firestore documents into BigQuery?” The extension will export existing documents as part of the installation and update processes.
Alternatively, you can run the external import script to backfill existing documents. If you plan to use this script, answer No when prompted to import existing documents.
Important: Run the external import script over the entire collection after installing this extension, otherwise all writes to your database during the import might be lost.
If you don’t either enable automatic import or run the import script, the extension only exports the content of documents that are created or changed after installation.
Transform function
Prior to sending the document change to BigQuery, you have an opportunity to transform the data with an HTTP function. The payload will contain the following:
{
data: [{
insertId: int;
json: {
timestamp: int;
event_id: int;
document_name: string;
document_id: int;
operation: ChangeType;
data: string;
},
}]
}
The response should be indentical in structure.
Using Customer Managed Encryption Keys
By default, BigQuery encrypts your content stored at rest. BigQuery handles and manages this default encryption for you without any additional actions on your part.
If you want to control encryption yourself, you can use customer-managed encryption keys (CMEK) for BigQuery. Instead of Google managing the key encryption keys that protect your data, you control and manage key encryption keys in Cloud KMS.
For more general information on this, see the docs.
To use CMEK and the Key Management Service (KMS) with this extension
- Enable the KMS API in your Google Cloud Project.
- Create a keyring and keychain in the KMS. Note that the region of the keyring and key must match the region of your bigquery dataset
- Grant the BigQuery service account permission to encrypt and decrypt using that key. The Cloud KMS CryptoKey Encrypter/Decrypter role grants this permission. First find your project number. You can find this for example on the cloud console dashboard
https://console.cloud.google.com/home/dashboard?project={PROJECT_ID}
. The service account which needs the Encrypter/Decrypter role is thenbq-PROJECT_NUMBER@bigquery-encryption.iam.gserviceaccount.com
. You can grant this role through the credentials service in the console, or through the CLI:
gcloud kms keys add-iam-policy-binding \
--project=KMS_PROJECT_ID \
--member serviceAccount:bq-PROJECT_NUMBER@bigquery-encryption.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--location=KMS_KEY_LOCATION \
--keyring=KMS_KEY_RING \
KMS_KEY
- When installing this extension, enter the resource name of your key. It will look something like the following:
projects/<YOUR PROJECT ID>/locations/<YOUR REGION>/keyRings/<YOUR KEY RING NAME>/cryptoKeys/<YOUR KEY NAME>
If you follow these steps, your changelog table should be created using your customer-managed encryption.
Generate schema views
After your data is in BigQuery, you can run the schema-views script (provided by this extension) to create views that make it easier to query relevant data. You only need to provide a JSON schema file that describes your data structure, and the schema-views script will create the views.
Billing
To install an extension, your project must be on the Blaze (pay as you go) plan
- This extension uses other Firebase and Google Cloud Platform services, which have associated charges if you exceed the service’s no-cost tier:
- BigQuery (this extension writes to BigQuery with streaming inserts)
- Cloud Firestore
- Cloud Functions (Node.js 10+ runtime. See FAQs)