こんにちは村上です。
AWSを使う時にAWSの管理コンソールをよく使うと思います。
でも、画面が重かったり、何回かクリックしてデータを取得する必要があるとかで、めんどくさいと思っている人もいるかもしれないです。
そんなあなたへaws-sdkのRuby版を使用したワンライナー特集です。
まずはじめに
aws-sdkをインストールします。
Gemfileに
1 2 |
source 'https://rubygems.org' gem "aws-sdk", '~>1' |
と書いて
1 |
bundle install |
※ ここではaws-sdkのv1を使用します。
IAMの設定
AWSを参照するためにIAMの設定をします。
下記に紹介するメソッドはReadOnlyがあれば動作します。
Userを作成し、アクセスキーとシークレットトークンを設定するか
Roleを設定し、EC2に設定するかをして下さい。
Userの場合は
1 |
AWS.config(access_key_id: 'XXXXXXXXXXXXXXXX', secret_access_key: 'XXXXXXXXXXXXXXXXXXXXXXXXXXX') |
が必要です。
(ここだけワンライナー見逃して。。。)
EC2編
まずはEC2の操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# ec2インスタンスの状態を取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:status) # ec2インスタンスのプライベートIPを取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:private_ip_address) # ec2インスタンスのパブリックIPを取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:public_ip_address) # ec2インスタンスのAZを取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:availability_zone) # # ec2インスタンスのtagのNameを取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:tags).map(&:Name) |
セキュリティG
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Ec2に紐づくセキュリティGのIDを取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:security_groups).map{|sgs| sgs.map{|sg| sg.id}} # Ec2に紐づくセキュリティGの名前を取得 AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:security_groups).map{|sgs| sgs.map{|sg| sg.name}} # Ec2に紐づくセキュリティGのインバウンド AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:security_groups).map{|sgs| sgs.map{|sg| sg.ingress_ip_permissions.map(&:ip_ranges) }} # Ec2に紐づくセキュリティGのアウトバウンド AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').instances.map(&:security_groups).map{|sgs| sgs.map{|sg| sg.egress_ip_permissions.map(&:ip_ranges) }} # セキュリティGに紐づくインスタンスID AWS::EC2.new(ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').security_groups.map{|sg| sg.instances.map(&:id)} |
激しいスクロールが発生。。。すいません。
ELB編
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ELB名を取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com').load_balancers.map(&:name) # ELBのエンドポイントを取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com').load_balancers.map(&:dns_name) # ELBのセキュリティGを取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com').load_balancers.map{|ins| ins.security_groups.map(&:id)} # ELBに紐づくEC2のインスタンスIDを取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com', ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').load_balancers.map(&:instances).map{|ins| ins.map(&:id)} # ELBに紐づくEC2のAZを取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com', ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').load_balancers.map(&:instances).map{|ins| ins.map(&:availability_zone)} # ELBに紐づくIn ServiceなEC2を取得 AWS::ELB.new(elb_endpoint: 'elasticloadbalancing.ap-northeast-1.amazonaws.com', ec2_endpoint: 'ec2.ap-northeast-1.amazonaws.com').load_balancers.map(&:instances).map{|ins| ins.health.map{|ins| ins[:instance].id}} |
激しいスクロールが発生。。。すいません。。
RDS編
続いてRDS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# RDSのIDを取得 AWS::RDS.new(rds_endpoint: 'rds.ap-northeast-1.amazonaws.com').db_instances.map(&:id) # RDSのDB名を取得 AWS::RDS.new(rds_endpoint: 'rds.ap-northeast-1.amazonaws.com').db_instances.map(&:db_name) # RDSのエンドポイントを取得 AWS::RDS.new(rds_endpoint: 'rds.ap-northeast-1.amazonaws.com').db_instances.map(&:endpoint_address) # RDSのエンジンを取得 AWS::RDS.new(rds_endpoint: 'rds.ap-northeast-1.amazonaws.com').db_instances.map(&:engine) # RDSのエンジンのバージョンを取得 AWS::RDS.new(rds_endpoint: 'rds.ap-northeast-1.amazonaws.com').db_instances.map(&:engine_version) |
Route53編
最後にRoute53です。
1 2 3 4 5 6 7 8 |
# ホストゾーンを取得 AWS::Route53.new(route53_endpoint: 'route53.ap-northeast-1.amazonaws.com').hosted_zones.map(&:name) # ホストゾーンに紐づく、レコード名を取得 AWS::Route53.new(route53_endpoint: 'route53.ap-northeast-1.amazonaws.com').hosted_zones.map{|host_zone| host_zone.resource_record_sets.map(&:name)} # ホストゾーンに紐づく、レコード名をタイプを取得 AWS::Route53.new(route53_endpoint: 'route53.ap-northeast-1.amazonaws.com').hosted_zones.map{|host_zone| host_zone.resource_record_sets.map(&:type)} |
まとめ
こんな感じで取得できます。
表示をもうちょっと見やすくするにはワンライナーは厳しいかもですね。
便利な使い方として、
上記のようなコードをcronで実行し、出力結果をファイルに保存します。
そのファイルをcatするコマンドを登録することで、AWSの情報を見れるようなコマンドを作ったりしてます。
例えばこんなのです。
1 2 3 4 5 6 7 8 9 |
cat /usr/local/bin/ec2info > #!/bin/bash > cat /tmp/ec2info ec2info > running production app app-server ap-northeast-1a id: i-XXXXXX Public IP: XX.XX.XX.XX Private IP XX.XX.XX.XX > running production app app-server ap-northeast-1c id: i-XXXXXX Public IP: XX.XX.XX.XX Private IP XX.XX.XX.XX > running production batch batch-server ap-northeast-1a id: i-XXXXXX Public IP: XX.XX.XX.XX Private IP XX.XX.XX.XX > running staging app-batch staging-server ap-northeast-1c id: i-XXXXXX Public IP: XX.XX.XX.XX Private IP XX.XX.XX.XX |
紹介したaws-sdkのメソッドを使えば簡単にできると思います。
ぜひ試してみてください。