ども、cloudpackかっぱ@inokara)です。ふと思ったのでメモです。

色々と調べたけど、結局は以下のようにするのかな…

インスタンス ID の取得は…

net/http を利用して meta-data からインスタンス ID を取得。

$ pry
[1] pry(main)> require 'net/http'
=> true
[2] pry(main)> metadata_endpoint = 'http://169.254.169.254/latest/meta-data/instance-id'
=> "http://169.254.169.254/latest/meta-data/instance-id"
[3] pry(main)> instance_id = Net::HTTP.get( URI.parse( metadata_endpoint ))
=> "i-xxxxxx"
[4] pry(main)>

インスタンスの各種情報は…

インスタンス ID が取得出来れば aws-sdk を使ったインスタンスの各種情報は取得出来そうです。

$ pry
[1] pry(main)> require 'aws-sdk'
=> true
[2] pry(main)> require 'net/http'
=> false
[3] pry(main)> metadata_endpoint = 'http://169.254.169.254/latest/meta-data/instance-id'
=> "http://169.254.169.254/latest/meta-data/instance-id"
[4] pry(main)> instance_id = Net::HTTP.get( URI.parse( metadata_endpoint ))
=> "i-xxxxxx"
[5] pry(main)> AWS.config.credentials
=> {:access_key_id=>"AKxxxxxxxxxxxxxxxxxx", :secret_access_key=>"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
[6] pry(main)> ec2 = AWS::EC2.new(region: "ap-northeast-1")
=> 
[7] pry(main)> i = ec2.instances[instance_id]
=> 
[8] pry(main)> i.dns_name
=> "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com"
[9] pry(main)>

上記の例は Public DNS Name を取得していますが、わざわざ aws-sdk を利用する必要もありませんね。

$ pry
[1] pry(main)> require 'net/http'
=> true
[2] pry(main)> metadata_endpoint = 'http://169.254.169.254/latest/meta-data/public-hostname'
=> "http://169.254.169.254/latest/meta-data/public-hostname"
[3] pry(main)> public_dns = Net::HTTP.get( URI.parse( metadata_endpoint ))
=> "ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com"
[4] pry(main)>

Public DNS Name 等の meta-data で取得出来る情報に限っては…もう、Ruby すら不要でした。

$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com

最後に

meta-data 便利。

ちゃん、ちゃん。

元記事はこちらです。
AWS 白帯シリーズ(21)aws-sdk for Ruby で自分自身のインスタンス情報をどうやって取得しましょうか