MyCSS

2010/03/23

Amazon EBSとRightAwsを使って自動バックアップ環境を構築する はてなブックマークに追加

Amazon EBSとは、EC2にアタッチする事の出来る外部ボリュームです。以下に素晴らしい解説記事があります。
要は外付けハードディスクなのですが、魅力的なのがボリューム毎に丸ごとバックアップが取れるという点です。これを定期的に実行しておけば、いざという時のバックアップになりますので、夜も良く眠れますw
※ちなみに、上記記事ではコマンドラインでの操作となっていますが、AmazonのGUIコンソールからもボタン一発でスナップショットが取れます。

バックアップは定期的に取らないと意味が無いので、自動化したい所です。自動バックアップの記事はいくつか見つけましたが、Ruby版が見つからなかったので自分で作りました。そのメモを残しておきます。

参考にさせていただいた記事:

やりたい事
定期的に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分おきにバックアプする事になります。

0 件のコメント :

コメントを投稿