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から参照されている場合は、最後に読み込んだものになります。