GCE上に立てたMastodonインスタンスの定期バックアップを構築したメモ
この記事を書いてから2週間くらい、Mastodonインスタンスは何の問題もなく動き続けている。 そろそろバックアップを取るようにして、いつ落ちても泣かなくて良いようにしようと思い、GCP上でバックアップフローを構築した。 Docker構成の都合上、GCEのVMインスタンス上にDBも存在しているので、DBのバックアップではなくそれを含むディスクごとスナップショットを取ることにした。
全体像はこんな感じ。枠線で囲った部分が新たに追加したところ。
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だししばらくは気にならない金額のはずなので気にしない。