LoginSignup
10
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-31

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

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5