要は外付けハードディスクなのですが、魅力的なのがボリューム毎に丸ごとバックアップが取れるという点です。これを定期的に実行しておけば、いざという時のバックアップになりますので、夜も良く眠れますw
※ちなみに、上記記事ではコマンドラインでの操作となっていますが、AmazonのGUIコンソールからもボタン一発でスナップショットが取れます。
バックアップは定期的に取らないと意味が無いので、自動化したい所です。自動バックアップの記事はいくつか見つけましたが、Ruby版が見つからなかったので自分で作りました。そのメモを残しておきます。
参考にさせていただいた記事:
- suz-lab - blog: EBSのスナップショットをローテーション(Amazon純正のツールとシェルスクリプトの組み合わせ)
- Amazon EBS と boto を使って自動バックアップ環境を構築する - つれづれなる・・・(Python版)
- 2606-36J: Amazon EBS Snapshotスクリプト(Python版)
やりたい事
定期的にEBSのバックアップを取る。その際、履歴を残しておく。古い履歴は自動削除されるようにする。やった事
上記の参考にさせていただいたスクリプトをもとに、Ruby版を考えてみました。RubyでAWSのAPIにアクセスするためには、RightAwsが主流だと思いますので、そちらを使います。
gemで配布されていますので、
sudo gem install right_aws
でインストール完了です・・と言いたい所ですが、これだと最新版が落ちてこないので、手動でgemパッケージを作って、ローカルからインストールしました。
git clone http://github.com/rightscale/right_aws.git cd right_aws rake gem sudo gem install pkg/right_aws-1.11.0.gem
gemコマンドでインストール出来るバージョンは、サポートするAWS APIのバージョンがちょっと古めです。別にそれでも問題はありませんが、新しいAPIですとスナップショットにdescriptionを残す事が可能になります。
「このスナップショットはどのボリュームのスナップショットなのか?」
という事をdescriptionにメモっておけば、管理が大変楽になります。
スクリプト本体
require 'rubygems'
require 'right_aws'
AWS_ACCESS_KEY = 'XXXXXXXX'
AWS_SECRET_KEY = 'YYYYYYYY'
unless ARGV.size == 3 then
puts 'Usage: ebs_snapshot.rb <num> <volume-id> <volume-label>'
exit 0
end
history = ARGV[0].to_i # 履歴はいくつ残しておくか?
vol_id = ARGV[1] # スナップショットを取るEBSのボリュームID
vol_label = ARGV[2] # スナップショットのメモ(description)
# descriptionを生成
# この場合だと、vol_labelに時刻をくっつけたものになります
t = Time.now
desc = "#{vol_label} #{t.strftime('%Y/%m/%d %H:%M:%S')}"
# スナップショットを取る
ec2 = RightAws::Ec2.new(AWS_ACCESS_KEY, AWS_SECRET_KEY)
ec2.create_snapshot(vol_id, desc)
# 保存してあるスナップショットで、目的のボリュームIDを持つものだけのリストを作る
snapshots = []
ec2.describe_snapshots.each do |snapshot|
if vol_id == snapshot[:aws_volume_id] then
snapshots << snapshot
end
end
# 履歴分を残して古いスナップショットを削除
snapshots = snapshots.sort_by { |snapshot| snapshot[:aws_started_at] }.reverse
snapshots.each_with_index do |snapshot, i|
unless i < history then
ec2.delete_snapshot(snapshot[:aws_id])
end
end
もし、自前でgemを作るのが難しい場合は、descriptionをサポートしないAPIになってしまいますが、上記のスクリプト23行目の
ec2.create_snapshot(vol_id, desc)を
ec2.create_snapshot(vol_id)にしてあげれば動作します。 これをcronに仕込んでやればOKです。
sudo crontab -e */30 * * * * /path/to/ebs_snapshot.rb 3 vol-12345678 "hogehoge data volume"この設定ですと、ボリュームIDが「vol-12345678」のものを、30分おきにバックアプする事になります。


