GAE Cron+Pub/Sub+Cloud FunctionsによるFirestoreのバックアップ定期実行
こちらの記事でバックアップ自体はgcloudコマンドで実行できることがわかりました。
本記事はこれを定期実行する為の手順を説明します。
Google Cloud SDKをインストール・Google Cloud StorageのBucket設定
こちらの記事を参照ください。
Danger!!
$ gcloud config set project [PROJECT_ID]でプロジェクトを設定しておいて下さい。他のプロジェクトに間違ってデプロイしないように。
functions-cronをクローンしてくる
$ git clone https://github.com/firebase/functions-cron
App Engine の設定・Deploy
$ cd appengine/
でappengineディレクトリに移動しておいてください。
cron.yaml
cron: - description: make a backup for firestore everyday at 00:00 url: /publish/firebase-backup schedule: every 24 hours
に変更する
$ gcloud app deploy app.yamlと$ gcloud app deploy cron.yamlを実行。
Updating config [cron]...done. Cron jobs have been updated
が出力されたら成功。

上記画像のようにcronジョブが登録されています。
functionsの設定・Deploy
GoogleAPIsをインストール
$ npm install googleapis
request-promiseをインストール
$ npm install --save request-promise
index.js
const {google} = require('googleapis')
const rp = require('request-promise')
const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
exports.backupFirestore = functions.pubsub.topic('firebase-backup').onPublish((message, context) => {
const projectId = '[PROJECT_ID]'
const getAccessToken = new Promise(function (resolve, reject) {
const scopes = ['https://www.googleapis.com/auth/datastore', 'https://www.googleapis.com/auth/cloud-platform']
const key = require(`./${projectId}.json`)
const jwtClient = new google.auth.JWT(
key.client_email,
undefined,
key.private_key,
scopes,
undefined
)
const authorization = new Promise(function (resolve, reject) {
return jwtClient.authorize().then((value) => {
return resolve(value)
})
})
return authorization.then(function (value) {
return resolve(value.access_token)
})
})
return getAccessToken.then(function (accessToken) {
const url = `https://firestore.googleapis.com/v1beta1/projects/${projectId}/databases/(default):exportDocuments`
return rp.post(url, {
headers: {
Authorization: `Bearer ${accessToken}`
},
json: true,
body: {
outputUriPrefix: `gs://${projectId}-backups-firestore`
}
})
})
})
に変更する。
秘密鍵の発行

上記画像の通り、IAMの管理 -> サービスアカウントを開きます。
[PROJECT_ID]@appspot.gserviceaccount.comのサービスアカウントに関して以下の2つのアカウントを紐付けます。
- Cloud Datastore Import Export Admin
- Storage Object Admin
gcloudコマンドで以下の2つを実行します。
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:storage.admin \
gs://[BUCKET_NAME]

その秘密鍵をPROJECTIDにrenameしてfunctionsディレクトリ内に配置します。
Deploy
$ firebase deploy --only functions --project [PROJECTID]
を実行します。
✔ Deploy complete!
と表示されれば成功です。

上記画像の通りfunctionが登録されている状態になります。
テスト実行

cronジョブの「今すぐ実行」をクリックしてステータスに「成功しました」と表示されれば成功です。

バケットにデータが追加されている状態が確認できます。
古いバックアップファイルを削除

バケットロックを選択し、ライフサイクルルールを設定します。

上記のように条件を30日として、次ページでアクションを「削除」として保存します。

画像のようにライフサイクルルールが追加されていれば成功です。

プログラマのためのGoogle Cloud Platform入門 サービスの全体像からクラウドネイティブアプリケーション構築まで
- 作者: 阿佐志保,中井悦司
- 出版社/メーカー: 翔泳社
- 発売日: 2017/06/02
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る

仕事で使える!Google Cloud Platform 最新クラウドインフラ導入マニュアル (仕事で使える!シリーズ(NextPublishing))
- 作者: 吉積礼敏,福田潔
- 出版社/メーカー: インプレスR&D
- 発売日: 2016/03/25
- メディア: Kindle版
- この商品を含むブログを見る