AWS SDK for Rubyを使ってみた

だいぶ遅ればせながらですが、AWS SDK for Rubyを試してみました。

インストール

インストールはgemが使える環境であれば、

$ sudo gem install aws-sdk

などするだけで、依存したgemと共にインストールされます。

動かしてみる

さて、簡単なコードを動かしてみます。EC2インスタンスのIDとAMIのIDを表示するだけの簡単なコードです。

#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'

if ENV['EC2_URL']
  ec2=AWS::EC2.new(:ec2_endpoint => ENV['EC2_URL'].sub(/^https?:\/\//,""))
else
  ec2=AWS::EC2.new
end

ec2.instances.each {|instance|
  p instance.id,instance.image.id
}
#  動作サンプル
$ ruby ec2din.rb 
"i-2a3d632b"
"ami-12d86d13"
"i-6a3d636b"
"ami-12d86d13"
"i-ae6e30af"
"ami-b8e842b9"
"i-94603e95"
"ami-b8e842b9"
"i-a8d38da9"
"ami-300ca731"

認証情報は、AWS_ACCESS_KEY_IDやAWS_SECRET_ACCESS_KEY環境変数を自動で見るようなので、設定している場合はそのまま動くと思います。
どこのリージョンのエンドポイントを使用するかについては、EC2_URL環境変数を使う事にしました。
設定していない場合は、下記のように設定してください。

$ export AWS_ACCESS_KEY_ID=_changeme_
$ export AWS_SECRET_ACCESS_KEY=_changeme_
$ export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com

もうちょっと複雑なサンプル

汚いコードですが、Volumeの作成元snapshot idから、元となったAMIの情報を"AMI"というタグに入れるサンプルです(実はこれがやりたかった)。

#!/usr/bin/env ruby
require 'rubygems'
require 'aws-sdk'

if ENV['EC2_URL']
  ec2=AWS::EC2.new(:ec2_endpoint => ENV['EC2_URL'].sub(/^https?:\/\//,""))
else
  ec2=AWS::EC2.new
end

ami2name=Hash::new
snap2ami=Hash::new
vol2snap=Hash::new

p "loading AMIs info..."
ec2.images.each {|ami|
  if ami.root_device_type == :ebs
    ami2name[ami.id]=ami.name
    ami.block_device_mappings.each_pair {|key, value|
      snap2ami[value.snapshot_id]=ami.id
    }
  end
}

p "loading volumes info..."
ec2.volumes.each {|vol|
  if vol.snapshot != nil
    vol2snap[vol.id]=vol.snapshot.id
  end
}

p "tagging volumes with original AMI info..."
vol2snap.each_pair {|vol,snap|
  if ami2name[snap2ami[vol2snap[vol]]]
    tagvalue=snap2ami[vol2snap[vol]]+" ("+ami2name[snap2ami[vol2snap[vol]]]+")"
    p vol+":AMI="+tagvalue
    ec2.volumes[vol].tag('AMI', :value => tagvalue)
  end
}
# 動作サンプル
$ ruby tag_org_ami_to_volumes.rb 
"loading AMIs info..." (ここで結構時間がかかると思います)
"loading volumes info..."
"tagging volumes with original AMI info..."
"vol-97dcd7fd:AMI=ami-300ca731 (amzn-ami-2011.02.1.i386-ebs)"
"vol-03a1ae69:AMI=ami-12d86d13 (ami-vpc-nat-1.0.0-beta.i386-ebs)"
"vol-e7a2ad8d:AMI=ami-12d86d13 (ami-vpc-nat-1.0.0-beta.i386-ebs)"

※1つのsnapshotが複数のAMIから参照されている場合は、最後に読み込んだものになります。

まとめ

right_awsと少し勝手が違って戸惑いましたが、ドキュメントを見てなんとかなりました。