背景
- AWS のタグを Ruby で取得したい
- AWS のアクセス用クレデンシャルとかの面倒な設定はヤだ
- カンタンに取得したい
やったこと
- IAM ロールを使って、EC2 のアクセス権を設定
- AWS クレデンシャルとかの環境変数は設定せず
- AWS-CLI を内部的に利用する
- タグの値を切り出すのは JMESPath を利用
- 内部的に
ec2-metadata
コマンドを利用- リージョンの取得
- インスタンスID の取得
- http://169.254.169.254/latest 以下にアクセスするより速い
- リージョンは Availability Zone から最後の1文字を除去
-
describe-instances
かdescribe-tags
かは悩んだ- 結局エイヤと
describe-instances
を使うことに決めた。
- 結局エイヤと
実装の詳細
# module to retrive AWS EC2 tag
module AwsMetaData
def self.availability_zone
`ec2-metadata --availability-zone | sed 's/placement: //'`.chomp
end
def self.region
availability_zone[0...-1]
end
def self.instance_id
`ec2-metadata --instance-id | sed 's/instance-id: //'`.chomp
end
def self.ec2 command
commandline = "aws --region #{region} --output text ec2 #{command}"
`#{commandline}`.chomp
end
def self.tag key
jamespath = "Reservations[].Instances[].Tags[?Key=='#{key}'].Value"
instance = "--instance-ids #{instance_id}"
ec2 %(describe-instances #{instance} --query #{jamespath})
end
end
参考文献
- http://qiita.com/hash/items/40006f91d4864ceaf991
- http://qiita.com/tt2004d/items/46ea80cd7cb20212e50e
- http://stackoverflow.com/questions/625644/find-out-the-instance-id-from-within-an-ec2-machine
- http://stackoverflow.com/questions/4249488/find-region-from-within-ec2-instance
- http://stackoverflow.com/questions/3883315/query-ec2-tags-from-within-instance