Firebase firestore 백업을 CloudFunctions에서 자동으로 실행해 보았습니다.

소개



atma(아토마) Advent Calendar 2019 25일째 담당의 코타입니다.
이번에는 Firestore를 만진 지식을 공유하고 싶습니다.

전제



Firestore에는 자동 백업 기능이 없습니다. <- 이것이 상당히 아프다.
그래서 Firestore export의 API를 Cloud Functions의 Cloud Pub/Sub에서 정기적으로 두드려 보았습니다.

결론



쉽게 구현할 수있었습니다.

index.js
const functions = require("firebase-functions");
// 初期化
const admin = require("firebase-admin");
admin.initializeApp();
// 東京リージョンでデプロイ
const FIREBASE_REGION = "asia-northeast1";
const rp = require("request-promise");
const { google } = require('googleapis');
/**
 * Firebase Cloud Firestoreのバックアップ処理
 */
exports.backupFirestoreData = functions
  .region(FIREBASE_REGION)       
  .pubsub.schedule('0 3 * * *')  //ここで実行隔離を指定
  .timeZone("Asia/Tokyo")       
  .onRun((context) => {
    const projectId = 'projectId'
    const scopes = ['https://www.googleapis.com/auth/datastore', 'https://www.googleapis.com/auth/cloud-platform']
    const key = require(`./${projectId}.json`)  //jsonからGCSへのアクセス権を読み込み
    const url = `https://firestore.googleapis.com/v1beta1/projects/${projectId}/databases/(default):exportDocuments`
    const jwtClient = new google.auth.JWT(
      key.client_email,
      key.private_key,
      scopes,
    )
    jwtClient.authorize().then((credentials) => {
      //日付を取得
      require('date-utils');
      const date = new Date();
      date.setTime(date.getTime() + 1000 * 60 * 60 * 9); // JSTに変換
      const formatted = date.toFormat("YYYY_MM_DD_HH24_MI_SS");
      rp.post(url, {
        headers: { Authorization: `Bearer ${credentials.access_token}` },
        json: true,
        body: { outputUriPrefix: `gs://projectId.appspot.com/backup/${formatted}` }
      })
    });
    return null;
  })

필수 패키지



Date 형을 다루기 쉽게 하는 date-utils 를 사용하고 있으므로 설치해 주세요.
$ npm install date-utils

or
$ yarn add date-utils

해설



Firestore export의 API를 Cloud Functions의 Cloud Pub/Sub에서 정기적으로 두드리고 있습니다.



서비스 계정이란?



서비스 계정은 개별 최종 사용자가 아닌 애플리케이션 및 가상 머신(VM)에 속한 특수 Google 계정입니다. 애플리케이션은 서비스 계정을 사용하여 사용자 참여 없이 Google 서비스 API를 호출할 수 있습니다.
  const key = require(`./${projectId}.json`)  //jsonからGCSへのアクセス権を読み込み

이 부분에서 서비스 계정 키를 로드합니다.

백업 대상



Firebase Cloud Storage 주소를 지정합니다.
  body: { outputUriPrefix: `gs://projectId.appspot.com/backup/${formatted}` }

백업한 것은 이런 식으로 저장됩니다.


※projectId는 본래 env에 기재해야 할 내용입니다만, 알기 쉽게 코드에 기재하고 있습니다.

마지막으로



위 코드는 서비스 계정 키 json을 전달합니다.

그 외에 Application Default Credentials라는 구조가 있는 것 같습니다.
htps : // c ぉ d. 오, ぇ. 코 m / 드 cs / 맞는 치치 치온 / p 로즈 c 치온? hl = 그럼
이 메커니즘을 사용하면 서비스 계정 키 json을 전달하지 않고 구현할 수 있습니다.
다음에 접할 기회가 있으면, 이 방법으로의 구현도 시험해 보고 싶습니다.

이상
Firebase firestore의 백업을 CloudFunctions에서 자동 실행해 보았습니다!

좋은 웹페이지 즐겨찾기