こんにちは、ピリカ開発チームの九鬼です。
昨年秋、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