要は外付けハードディスクなのですが、魅力的なのがボリューム毎に丸ごとバックアップが取れるという点です。これを定期的に実行しておけば、いざという時のバックアップになりますので、夜も良く眠れます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分おきにバックアプする事になります。