Edited at

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

More than 1 year has passed since last update.

バックアップといえばコードはバージョン管理システムに入れて、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)