wheatandcatの開発ブログ

React Nativeで開発しているペペロミア & memoirの技術系記事を投稿してます

Firestoreの定期バックアップを実装する

memoirのデータは全てFirestoreで管理しているのでバックアップを実装したのでメモとして残しておく

コード

github.com

実装

ほぼ以下のドキュメントの通り作成しただけなので手順をそのまま記載

firebase.google.com

まず、保存に使用するbucketをCloud Storageに作成

名前: memoir-firestore-backup

f:id:wheatandcat:20210403194544p:plain

次に定期バックアップ用の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にデプロイされました

f:id:wheatandcat:20210403194959p:plain

権限周りの設定が必要なので、以下のコマンドを実行

$ 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のインポート/エクスポートの画面を確認すると以下のように表示される

f:id:wheatandcat:20210403195242p:plain

ちゃんと4:00に定期バックアップが取れているのが確認できました。 もしデータをインポートしたい場合は、上記の画像の画面でインポートをクリックして、対象のファイルを選択すればOKです。