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에서 자동 실행해 보았습니다!
Reference
이 문제에 관하여(Firebase firestore 백업을 CloudFunctions에서 자동으로 실행해 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kota-nakagawa/items/4f9dfd5a26505ad20515텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)