GCPでComputeEngineのバックアップを定期取得


バックアップといえばコードはバージョン管理システムに入れて、DBデータはCloud SQLでバックアップの機能あるし、画像ファイルはGoogle Cloud Storageで管理すればいいだろ?
そんな風に考えていた時期がありました。いやもっと最小構成でいいんだこれが。DBなんかWEBサーバと同居でいいから。ていうか今そこまで手がまわらないからとりあえずサーバの定期バックアップ頼む! スナップショットでいい。とりあえずなにもないよりは断然いい!! そんな感じでバックアップ取りたいときに。

構成と仕様

  • 常設サーバは1台(WEBサービス、DB同居)
    • 他の管理サーバは立てたくない
    • 自宅のPCすら定期的に立ち上げるかは保証できない
    • つまり本番稼働しているサーバからバックアップをキックしたい。
  • 常設サーバから日次でスナップショットの取得/削除を投げる
    • 過去1週間分は必須だけど増やしすぎてもアレなので順次削除したい
    • とはいえうっかり忙しかったときのために、過去1週間−日次、それ以上過去−月次(月末分)で保存しておこうと思う
    • 月次分が増えすぎるのは、気づいた時に手動削除

事前準備

バックアップを動かすサーバで以下を実行。gcloud入ってなかったら入れてください。

gcloud auth login
gcloud config set project [project-id]

スクリプト

INSTANCE_NAME=[your-instance-name]
SNAPSHOT_ZONE_NAME=[your-snaphot-zone-id]
SNAPSHOT_PREFIX=[your-snaphot-prefix]


if [ `date -d '1 day' +'%d'` = "01" ];then 
    gcloud compute disks snapshot -q ${INSTANCE_NAME} --zone=${SNAPSHOT_ZONE_NAME} --snapshot-names=${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date +'%Y%m'` 
fi 

for i in `seq 8 14`;do 
    gcloud compute snapshots delete -q ${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date -d "${i} days ago" +'%Y%m%d'` 
done 

gcloud compute disks snapshot -q ${INSTANCE_NAME} --zone=${SNAPSHOT_ZONE_NAME} --snapshot-names=${SNAPSHOT_PREFIX}-${INSTANCE_NAME}-`date +'%Y%m%d'` 

※毎日動くことを想定しているのなら古いsnapshotのdeleteは1日分(8日前分)だけでいいはずですけれども、なんとなく、つい、念のため。存在しないスナップショットに対し削除かけるとエラーが返ってきますが問題はないです。

cronに設定

日次で設定。時間はまあ適当に。

0 0 * * * bash /path/to/your/backup.sh

動作確認OS

Debian GNU/Linux 9 (stretch)