memoirのデータは全てFirestoreで管理しているのでバックアップを実装したのでメモとして残しておく
コード
実装
ほぼ以下のドキュメントの通り作成しただけなので手順をそのまま記載
まず、保存に使用するbucketをCloud Storageに作成
名前: memoir-firestore-backup
次に定期バックアップ用のCloud Functionを作成
$ firebase init functions --project PROJECT_ID
そのままTypeScriptを選択して、functions/src/index.tsを以下のように修正
■ functions/src/index.ts
import * as functions from "firebase-functions"; import * as firestore from "@google-cloud/firestore"; const client = new firestore.v1.FirestoreAdminClient(); // Replace BUCKET_NAME const bucket = "gs://memoir-firestore-backup"; const timezone = "Asia/Tokyo"; process.env.TZ = timezone; exports.scheduledFirestoreExport = functions .region("asia-northeast1") .pubsub.schedule("every day 04:00") .timeZone(timezone) .onRun(() => { const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT || ""; const databaseName = client.databasePath(projectId, "(default)"); return client .exportDocuments({ name: databaseName, outputUriPrefix: bucket, // Leave collectionIds empty to export all collections // or set to a list of collection IDs to export, // collectionIds: ['users', 'posts'] collectionIds: [], }) .then((responses) => { const response = responses[0]; console.log(`Operation Name: ${response["name"]}`); }) .catch((err) => { console.error(err); throw new Error("Export operation failed"); }); });
timeZoneを指定しないとUTCの時間で実行されるので注意
こちらを以下のコマンドでデプロイ
$ firebase deploy --only functions
これでCloud Functionにデプロイされました
権限周りの設定が必要なので、以下のコマンドを実行
$ gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECT_ID@appspot.gserviceaccount.com \ --role roles/datastore.importExportAdmin
バケットにも権限を追加
$ gsutil iam ch serviceAccount:PROJECT_ID@appspot.gserviceaccount.com:admin \ gs://BUCKET_NAME
スクリプトは毎朝4時に実行されるように設定しているので、実行後にGCPのFirestoreのインポート/エクスポートの画面を確認すると以下のように表示される
ちゃんと4:00に定期バックアップが取れているのが確認できました。 もしデータをインポートしたい場合は、上記の画像の画面でインポートをクリックして、対象のファイルを選択すればOKです。