Firestore の Document を定期的にバックアップする


公式ドキュメントが充実しているので、基本的には以下を参考にすれば済みます。

昔は GAE のインスタンスを作って cron job を定義して...という作業をしていましたが、今は☝️に書いた感じで済みます。

定期的なエクスポートの部分だけ、TypeScript のサンプルコードを載せます。

sample.ts
export const exportFirestoreFunc = functions.region('asia-northeast1').pubsub
    .schedule('every day 05:00')
    .timeZone('Asia/Tokyo')
    .onRun(async _ => await exportToStorage())

async function exportToStorage(): Promise<void> {
  const admin = await import('firebase-admin')
  admin.initializeApp()
  const gcpProjectId = admin.instanceId().app.options.projectId
  const bucket = `gs://${gcpProjectId}.appspot.com`
  const client = new admin.firestore.v1.FirestoreAdminClient()
  const databaseName = client.databasePath(gcpProjectId, '(default)')

  try {
    const res : any[] = await client.exportDocuments({
        name: databaseName,
        outputUriPrefix: bucket,
        collectionIds: ['foo', 'bar']
    })
    console.info(`Operation Name: ${res[0]['name']}`)
  } catch (err) {
    console.error(err)
    throw new Error('Export operation failed')
  }
}