1クリックで毎日スナップショットを自動取得 〜 ソンナコトモアロウカト編 | アドカレ2013 : CFn #14

2013.12.14

はじめに

こんにちは植木和樹です。

このエントリは『アドベントカレンダー2013:AWS CloudFormationビッグバンテンプレート』14日目の内容となります。今回は『毎日定時刻にEC2スナップショットを自動取得する格安ソリューション』を一発構築してみたいと思います。 先日13日目は都元さんのGitBucket編でした。

「ソンナコトモアロウカト」について

EC2インスタンスを利用する際は通常ローカルディスクにEBSを用いるかと思います。EBS自体はAWS内部で冗長化されておりデータ消失の可能性が極低いです。とはいえEBS破損の可能性はゼロではないですし、オペミスによるファイル削除の可能性もあり日々のスナップショット取得は行っておきたいものです。

日々定時刻にスナップショットを取得するAPIを呼び出せばいいだけなのですが、それだけのためにEC2インスタンスを常時稼働させるのはコストがかかってしまいます。t1.microでも月額2000円はかかります。1日1回、決まった時間にEC2が自動起動してスナップショットを取得し、終わったら自動で終了してくれたらうれしいですよね。本日はそんな自動バックアップの仕組みをCloudFormation一発で作成してみたいと思います。

お客様「EBS障害でデータ消えちゃったよ!どうにかならない!?」
クラメソ「ソンナコトモアロウカト、ちゃんと入れておきましたよ!」

万が一の事態もこれで安心です。

スタック作成前の作業

今回のバックアップの仕組みはaws-missing-tools/ec2-automate-backupを踏襲しています。

バックアップの対象にしたいEBSには事前にBackup=trueというタグをつけておいてください。タグ付けはマネージメントコンソールから可能です。

20131214_cfn-adv_001

GUIで設定するのが面倒な場合は、aws-cliを使ってまとめて設定も可能です。

volumes=$(aws ec2 describe-volumes --query 'Volumes[*].VolumeId' --output text)
for vol in $volumes; do
  echo "add Backup=true tag to volume[${vol}]"
  aws ec2 create-tags --resources $vol --tags Key=Backup,Value=true
done

公開テンプレート

スナップショットを取得するEC2はAPIを呼び出すだけで、他のEC2やRDSとの通信は行いません。お手軽に使っていただくために、VPCごとまとめて作成するテンプレートをご用意しました。いくつかパラメータに入力すれば、すぐにお使いいただけます。VPCのCIDRは10.255.0.0/16となっています。

テンプレートを起動すると、入力パラメータとして5つ求められます。

スタックパラメータ

KeyName
EC2にログインするためのキーペア名
WorkerInstanceType
バックアップを実行するEC2のインスタンスタイプ(初期値:t1.micro)
Recurrence
crontab形式で指定するバックアップ時刻(初期値:"0 0 * * *"、毎日0:00 UTCに実行)
BackupRetention
バックアップを残す日数(初期値:7 日)
SSHFrom
EC2へのssh接続を許可するIPアドレス(初期値:0.0.0.0/0)

ソンナコトモアロウカト を起動

2014/03/25 Ver 1.2にアップデートしました。バージョン1.0で作成したスタックをアップデートする場合は、事前にAutoScalingのScheduled Actionを削除してください。(スタックアップデートに失敗してしまいます)

$ aws autoscaling describe-scheduled-actions
$ aws autoscaling delete-scheduled-action --scheduled-action-name cm-create-snapshot \
--auto-scaling-group-name auto-ec2-snapshot-AutoScalingGroupServers-XXXXXXXXXXXX

スタック作成後の作業

スタック作成が完了するとEC2が1台起動します。このEC2は起動時に以下の処理を実行します。

  1. "Recurrence"で指定したスケジュールでEC2が自動起動するようAutoScalingに設定
  2. タグに"Backup=true"がついたEBSボリュームをバックアップ
  3. "BackupRetention"の日数が経過した古いスナップショットを削除
  4. 自分自身をTerminateするためにAutoScalingの稼働台数をゼロに設定

Snapshot画面でスナップショットが作成されていれば成功です!

初回バックアップはスタック作成時に実行しますが、次回以降はRecurrenceで指定したスケジュールに従って定時刻に実行してくれます。

まとめ

AWS CloudFormationビッグバンテンプレート、14日目をお送り致しました。不慮の事態に備えるバックアップ「ソンナコトモアロウカト」。1日1時間分のt1.micro課金だけなので、月々たった200円(+スナップショットストレージ料金)でバックアップできます。ぜひご活用ください。

テンプレートファイルはGitHubに公開してあります。pull-req 大歓迎です。

明日15日目のテンプレートもご期待ください!