GCEのInstanceの停止時にDiskのスナップショットを自動で撮る


経緯

  • 運用しているgitlabがバージョンアップに伴い動かなくなり、リカバリーに時間が取られる事件が発生した。
  • これを契機に改めてバックアップについてちゃんとできているか考えたところ、Diskのバックアップ撮ってないなーと今更ながら思い、バックアップを取る仕組みを検討するに至る。

方針

  • 定時後に自動でgitlab停止する運用をしているので、shutdown-scriptでスナップショット取ることでバックアップする。

実コード

  • 20180828 フィルタを完全一致に変更
shutdown-script.sh
ZONE="$(curl -s -f -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/zone | xargs basename)"
PROJECT="$(curl -s -f -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/project/project-id)"

gcloud compute disks list --filter "users=(https://www.googleapis.com/compute/v1/projects/${PROJECT}/zones/${ZONE}/instances/$(hostname))" --format "[no-heading](name)" | while read line;
do
  gcloud compute disks snapshot ${line} --zone $ZONE --async --snapshot-names=${line}-$(date "+%Y%m%d%H%M")
done

補足

  • boot disk以外のdiskもスナップショットの対象とできるように、自身のインスタンスに紐づくDiskを洗い出してからスナップショットを取得するようにした。
  • gcloud compute disks snapshotする際にasyncオプションつけることで、スナップショットの生成に90s(Preemptibeの場合30s)以上かかる場合でもちゃんとバックアップできるようにした。