«前の日記(2011-08-10 (Wed)) 最新 次の日記(2011-08-16 (Tue))» 編集

雑記帳


2011-08-15 (Mon) [長年日記]

[AWS][Ruby] アタッチ済みのボリュームから作成したスナップショットのうち最新のみの一覧を取得する

AWSでは、スナップショットを使って簡単にバックアップが取得できるので、長期的にバックアップを残す場合には、同じボリュームに対してたくさんのスナップショットができることになる。これらのうち、最新のスナップショットの一覧を取得する必要ができたので、例によってRubyで書いてみた。

require 'aws-sdk'

yaml = YAML.load(File.read('config.yml'))
AWS.config(yaml)

ec2 = AWS::EC2.new(:ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com')

owner_id = yaml['owner-id']

as = []
ec2.volumes.each do |v|
  v.attachments.each do |a|
    as << a
  end
end
ss = {}
r.snapshots.filter('owner-id', owner_id).sort {|a,b|
  b.start_time <=> a.start_time
}.map do |s|
  ss[s.volume_id] = s unless ss.include? s.volume_id
end
as.each do |a|
  vid = a.volume.id
  puts "#{a.instance.id} => #{vid} => #{ss[vid].id} (#{ss[vid].start_time})" if ss.include? vid
end

これを実行した結果は、次のようになる。

i-27835d1d => vol-359a6aea => snap-3ca48ff0 (2011-08-15 07:33:23 UTC)
i-27835d1d => vol-62c8fd63 => snap-85b56c34 (2011-08-15 07:32:49 UTC)

EBSをアタッチしているインスタンスと、ボリューム、それに対応するスナップショットの各IDと、スナップショットの作成された時間(start_time)を出力している。同じボリュームのスナップショットのうち、最も新しいもののみを抽出しているのがポイント。

ただし、スナップショットの量が多いと、特にsortをしているときにタイムアウトしてしまうことも多いので、もう少し工夫が必要。