Open4

お試しCloud Firestore data bundles

Mamoru AmanoMamoru Amano

https://firebase.google.com/docs/firestore/bundles

これを試す。
静的ファイルとしてビルドした Firestore の QuerySnapshot や DocumentSnapshot をクライアントサイドで読み込み利用するための仕組み。静的ファイルなのでCDNとかを利用できる。

メリットはFirestoreの料金の削減できること。
例えば、不特定多数のユーザーが同じドキュメント(例:ニュースサイトのトップ10の記事)へアクセスするような場合、各ユーザーがドキュメントを読み込むごとに課金される。これはユーザー数が増えれば増えるほど課金が増える。

同様の問題への対策として、Firestoreへのリクエストを Cloud Functions で行い、結果をキャッシュするという方法があったけど、FirestoreのクライアントSDKを経由してデータアクセスできるという点で嬉しい。

https://firebase.blog/posts/2021/04/firestore-supports-data-bundles

Mamoru AmanoMamoru Amano

bundleファイルの生成とGCSへのアップロード

import * as fs from 'fs'

import * as admin from 'firebase-admin'

const serviceAccount = require('path/to/credential')

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
})

const BUCKET_NAME = 'xxxx.appspot.com'
const timestamp = new Date().valueOf()
const db = admin.firestore()
const storage = admin.storage
const bundleId = `bundle-${timestamp}`

const snapshot = await db
  .collection('User')
  .limit(10)
  .get()

const buffer = db
  .bundle(bundleId)
  .add('bundle-users', snapshot)
  .build()

const bundledFilePath = `./${timestamp}.txt`
fs.writeFileSync(bundledFilePath, buffer)

const destination = `firestore-data-bundles/${bundleId}.txt`
await storage()
  .bucket(BUCKET_NAME)
  .upload(bundledFilePath, {
    destination,
    public: true,
    metadata: { cacheControl: `public, max-age=3600` }
  })

console.log(
  `uploaded to https://storage.googleapis.com/${BUCKET_NAME}/${destination}`
)

https://zenn.dev/moga/articles/firestore-data-bundles をかなり参考にしてる。

Mamoru AmanoMamoru Amano

TODO

  • 出力されるファイルを見てみる
  • admin sdk に存在する select() を使った場合
  • add('query', QuerySnapshot).add(DocumentSnapshot)というようにチェインした場合