Firestoreのスケジュールバックアップが提供開始されたので設定した話

こんにちは、ピリカ開発チームの九鬼です。

昨年秋、Firestoreのバックアップのプレビュー版が提供され始めました。費用・管理面で日々のバックアップで利点があったため、導入した話を共有いたします。

背景

Firestore上のデータをバックアップする場合、これまでFirestoreのエクスポート/インポートを使う必要がありました。この方式において、以下の課題がありました。

  • エクスポートしたドキュメント数に比例して読み取り費用が発生する
    • データベース全体で5000万ドキュメントがある場合、nam5リージョンでおよそ$30/回かかる計算になります。
  • 定期バックアップさせる場合、バックアップ用の関数を作る必要がある
  • バックアップ間でデータの損失が発生したとき、復旧する手段がない

そんな折、昨年秋にスケジュールバックアップが公開プレビュー版で提供されました*1。このバックアップでは、以下の特徴があります。

  • 設定した保持期間が過ぎると、自動で当該バックアップをクリアする
  • バックアップ費用は、ストレージ費用(GiB/月)に対して課金される。Firestoreの読み取り費用は含まれない
  • ポイントインタイムリカバリ(PITR)と組み合わせることで、日々のデータ復元はPITR、週次のデータ復元はスケジュールバックアップでカバーと運用できる
  • バックアップの作成・保持はfirestoreのパフォーマンスには影響しない
  • gcloudを使って設定できる

以上の点から、費用・管理面で利点があります。 そこで、1GCPプロジェクトに対してエクスポートを月1で残しつつ、試験的にデータのバックアップを追加しました。

注意点

スケジュールバックアップは以下の制約があります。

  • バックアップは、バックアップ元のデータと同じロケーションに作成されます。したがって、災害対策には適しません
    • このため、firestoreのエクスポートを予備のフルバックアップとして、別のロケーションに保存しておくことが望ましいです
  • 指定したバックアップの日・週・月において、何時頃にバックアップがされるかは不定です

設定方法

IAMの設定

スケジュールバックアップを設定するプリンシパルについて、以下のロールいずれかが必要です。

  • roles/datastore.backupSchedulesAdmin: バックアップ スケジュールに対する読み取り / 書き込みアクセス権

データのリストアを行う場合は roles/datastore.restoreAdmin が追加で必要となります。roles/datastore.owner を追加するとFirestore全体の完全アクセス権が得られるものの、強めの権限になるので推奨されません。

スケジュールの設定

毎週火曜に、保持期間7日でデフォルトのデータベースをバックアップするよう下記の通り設定しました。

# 2024/7 現在、alpha はなくても良い
gcloud alpha firestore backups schedules create \
--database='(default)' \
--retention=7d \
--recurrence=weekly \
--day-of-week=TUE \
--project=your-project

コマンド実行後、以下のコマンドで設定したバックアップスケジュールを確認できます。

gcloud alpha firestore backups schedules list --database "(default)" --project=your-project
createTime: '2024-02-22T01:34:43.295238Z'
name: projects/your-project/databases/(default)/backupSchedules/c01831f3-367c-4155-838a-1ab19df0ac72
retention: 604800s
updateTime: '2024-02-22T01:34:43.295238Z'
weeklyRecurrence:
  day: TUESDAY

この状態で翌火曜日になると、下記の通りバックアップが作成されました。なお、月曜日に何時頃バックアップが作成されるかは不定です。UTCの午前0時に作られることもあれば、午後11時50分前後になっても作られていない場合があります。

gcloud firestore backups list --project=your-project
database: projects/your-project/databases/(default)
databaseUid: 0f44f5b9-fb06-40c8-b4aa-5ff7da62ae8b
expireTime: '2024-03-05T13:50:53.234353Z'
name: projects/your-project/locations/asia-northeast1/backups/8244ea64-312c-49a8-b8ef-589e6194292c
snapshotTime: '2024-02-27T13:50:53.234353Z'
state: READY