【お知らせ】1クリックで毎日スナップショットを自動取得 〜 ソンナコトモアロウカト v1.5 リリース

はじめに

こんにちは植木和樹@上越妙高オフィスです。

このエントリは『アドベントカレンダー2013:AWS CloudFormationビッグバンテンプレート』14日目でご紹介した『毎日定時刻にEC2スナップショットを自動取得する格安ソリューション』のバージョンアップのお知らせとなります。

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

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

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

バージョン1.5での変更点

  • cfn-init時にセットアップでエラーがでる問題に対応しました。(エラー発生時もバックアップは正常に行われています)
  • バックアップを実行するEC2のインスタンスタイプをt1.microからt2.[nano|micro|small]に変更しました。
  • EC2のAMIイメージをPVからHVMに変更しました。

スタック作成前の作業

今回のバックアップの仕組みは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)
OperatorEmail
バックアップでエラーが発生した場合の通知先メールアドレス

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

すでにご利用の方は下記URLを指定してスタックのアップデートを行ってください。
https://cm-public-cfn-templates.s3-ap-northeast-1.amazonaws.com/sonna-kotomo-aroukato/sonna-kotomo-aroukato-1.5.template

スタック作成後の作業

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

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

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

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

まとめ

EC2 + cloud-init で行なう本アーキテクチャも古くさい感じがしてきました。そろそろLambdaを使ってServless化したいと考えています。