lacolaco

唐揚げとアニメとプログラミングが大好きです

GCE上に立てたMastodonインスタンスの定期バックアップを構築したメモ

lacolaco.hatenablog.com

この記事を書いてから2週間くらい、Mastodonインスタンスは何の問題もなく動き続けている。 そろそろバックアップを取るようにして、いつ落ちても泣かなくて良いようにしようと思い、GCP上でバックアップフローを構築した。 Docker構成の都合上、GCEのVMインスタンス上にDBも存在しているので、DBのバックアップではなくそれを含むディスクごとスナップショットを取ることにした。

全体像はこんな感じ。枠線で囲った部分が新たに追加したところ。

f:id:lacolaco:20180920224248p:plain

Cloud Schedulerはまだアルファなので詳細は伏せる。ざっくりcron on GCPのようなもの。 週に1回のサイクルでCloud PubSub経由でCloud Functionsを起動し、呼び出される関数でGCEのクライアントライブラリを使ってスナップショットを作成する。 関数はこのような感じ。

// Imports the Google Cloud client library
const Compute = require('@google-cloud/compute');
const format = require('date-fns/format');
 
// Creates a client
const compute = new Compute();
 
const zone = compute.zone('<zone>');
const disk = zone.disk('<disk name>');

function generateSnapshotName(date) {
    return 'snapshot-' + format(date, 'YYYY-MM-DD');
}

/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event Event payload.
 * @param {!Object} context Metadata for the event.
 */
exports.run = async (event, context) => {
  console.log('== begin job');
  const snapshotName = generateSnapshotName(new Date());
  console.log('snapshotName: ', snapshotName);
  const snapshotData = await disk.createSnapshot(snapshotName);
  console.log(snapshotData);
  console.log('== finish job');
};

いまのところうまく動いている。スナップショットが溜まると金を食うけども、そもそもディスクが10GBだししばらくは気にならない金額のはずなので気にしない。