cronでHerokuのDBを定期的にリストアする


概要

現在、Heroku上で下記のようなデモサイトを運用しています。

オープンソースの営業支援システム「FreeSFA」
https://free-sfa.tk/

デモサイト
https://free-sfa-demo.herokuapp.com/

このデモサイトは使い勝手を確認してもらうために作ったので、登録されたデータを残しておく必要がありません。むしろ定期的にリストアしてきれいな状態を保っておく方が管理する上でも都合が良いです。

ということでherokuコマンドを使って定期的にリストアする方法を調べたのですが、これが意外と見つかりません。
heroku schedulerの情報は大量にヒットしましたが、今回の目的には微妙に合致しません。

heroku pg:backupsには、自動でバックアップする機能はありますが、自動でリストアする機能はありません。
仕方ないので我流でやってみました。
もっとエレガントな方法があるかもしれませんが、とりあえず動いたので、記録を残しておきます。

実行環境

Ubuntu 18.04 (GCEの無料枠で稼働中)
Heroku CLI 7.18.9
DBはHeroku PostgreSQL

作業内容

Heroku CLIのインストール

$ sudo snap install --classic heroku

Herokuにログイン

$ heroku login --interactive

バックアップ実行

$ heroku pg:backups capture -a {アプリ名}

バックアップの確認例

無料版のHerokuでは、バックアップは2世代まで保存できます。
この例ではb006というIDのバックアップをリストアの対象にしています。
実験した後なのでリストアの履歴も残っています。

$ heroku pg:backups -a {アプリ名}
 ›   Warning: heroku update available from 7.18.9 to 7.18.10
=== Backups
ID    Created at                 Status                               Size      Database
────  ─────────────────────────  ───────────────────────────────────  ────────  ────────
b006  2018-11-27 04:06:43 +0000  Completed 2018-11-27 04:06:46 +0000  126.67KB  DATABASE
b004  2018-11-15 05:39:09 +0000  Completed 2018-11-15 05:39:11 +0000  126.28KB  DATABASE
=== Restores
ID    Started at                 Status                               Size      Database
────  ─────────────────────────  ───────────────────────────────────  ────────  ────────
r012  2018-11-27 05:25:06 +0000  Completed 2018-11-27 05:25:08 +0000  126.67KB  DATABASE
r011  2018-11-27 04:56:24 +0000  Completed 2018-11-27 04:56:27 +0000  126.67KB  DATABASE
r010  2018-11-27 04:50:10 +0000  Completed 2018-11-27 04:50:12 +0000  126.67KB  DATABASE
r009  2018-11-27 04:48:48 +0000  Completed 2018-11-27 04:48:50 +0000  126.67KB  DATABASE
r008  2018-11-27 04:47:53 +0000  Completed 2018-11-27 04:47:55 +0000  126.67KB  DATABASE
r007  2018-11-27 04:07:15 +0000  Completed 2018-11-27 04:07:17 +0000  126.67KB  DATABASE
r005  2018-11-27 02:43:43 +0000  Completed 2018-11-27 02:43:45 +0000  126.28KB  DATABASE
r003  2018-11-05 01:20:02 +0000  Completed 2018-11-05 01:20:04 +0000  120.90KB  DATABASE
r002  2018-11-05 01:19:08 +0000  Completed 2018-11-05 01:19:11 +0000  120.90KB  DATABASE

リストア用バッチファイルの作成例

crontabに直書きするとメンテナンスしにくくなるので、シェルスクリプトを書きます。

restore.sh
#!/bin/bash
date
/snap/bin/heroku pg:backups restore -a {アプリ名} --confirm {アプリ名}

crontabの例

毎朝4時にリストアされるようにしました。

0 4 * * * ~/devel/heroku/restore.sh >> ~/log/heroku/restore.log 2>&1

動作確認

crontabを修正し、数分後にリストアされるようにして、架電実績と訪問実績を入力しました。

数分後。

$ cat restore.log
2018年 11月 27日 火曜日 16:58:01 JST
 ›   Warning: heroku update available from 7.18.9 to 7.18.10
Starting restore of b006 to postgresql-cubic-14048... done
Use Ctrl-C at any time to stop monitoring progress; the backup will continue restoring.
Use heroku pg:backups to check progress.
Stop a running restore with heroku pg:backups:cancel.
Restoring... done

入力した架電実績と訪問実績が0件に戻りました。

雑感

cronで実行したときにHeroku CLIのログイン状態が保持されるかどうかが心配でしたが、普通に動いてくれました。
これでデモサイトのDBはきれいな状態に保たれるはずです。