AWS-SDK Ruby で EC2 のインスタンス名からインスタンス id / ip address を取得する #aws #ec2 #ruby

# AWS-SDK Ruby で EC2 のインスタンス名からインスタンス id / ip address を取得する #aws #ec2 #ruby
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
AWS-SDK Ruby で <i class="fa fa-cloud" style="font-size:1em;"></i> EC2 のインスタンス名からインスタンス id / ip address  を取得します
## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 目的
Vagrant AWS provider で EC2 のインスタンス名を tag name で指定して、 `vagrant up` で EC2 インスタンスを生成した後に、
後続の自動デプロイ処理に必要となる IPアドレス・インスタンス id を tag name を元に取得したい。

### Vagrantfile 例
~~~ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

$shell =<<-EOS
# some provisioning logic
EOS

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    Dotenv.load
    aws.access_key_id             = ENV['ACCESS_KEY_ID']
    aws.secret_access_key         = ENV['SECRET_ACCESS_KEY']
    aws.keypair_name              = ENV['KEY_PAIR_NAME']

    aws.region                    = "ap-northeast-1"
    aws.ami                       = 'ami-858eb884'
    aws.instance_type             = 't1.micro'
    aws.security_groups           = 'sample'
    timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
    aws.tags = {
      'Name' => "vagrant_aws_test_#{timestamp}",
    }

    override.ssh.username         = "core"
    override.ssh.private_key_path = "/path/to/your/key"

    config.vm.provision :shell, :inline => $shell
  end
end
~~~

## <i class="fa fa-files-o" style="font-size:1em;"></i> 手順
### <i class="fa fa-file-text" style="font-size:1em;"></i> Gemfile
認証のための環境変数は <i class="fa fa-external-link" style="font-size:1em;"></i> [dotenv GitHub](https://github.com/bkeepers/dotenv) を利用します

~~~ruby
source "https://rubygems.org"

gem "dotenv"
gem "aws-sdk"
~~~

### <i class="fa fa-gears" style="font-size:1em;"></i> AWS API 用認証情報の取得
* AWS Management Console にサインイン
* IAM コンソールに移動
    ![aws1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/865ccf0c-d63a-783c-c18b-b1a4e820a732.png)

* 画面サブの [Navigation] ペインで [Users] をクリック
    ![aws2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/46821c0d-dccb-20de-365d-34a0ff2782cf.png)

* 対象ユーザーを選択
* 画面下部の Security Credentials の Manage Access Keys を選択
* ダイアログの下部にある [Create Access Key] をクリック
* ページの下部にある [Download Credentials] をクリック
* アクセスキー ID とシークレットアクセスキーを CSV ファイルとしてコンピュータに保存
    * このファイルは安全な場所に保存
    * シークレットアクセスキーの再取得は不可能

### <i class="fa fa-gears" style="font-size:1em;"></i> .env
AWS Management Console から取得した情報を .env に設定する

~~~
ACCESS_KEY_ID=your_access_key
SECRET_ACCESS_KEY=your_secret_key
EC2_ENDPOINT=your_endpoint
~~~

### <i class="fa fa-code" style="font-size:1em;"></i> read_ec2_instance_id_and_key.rb

~~~ruby
require 'aws-sdk'
require 'dotenv'

Dotenv.load
ec2 = AWS::EC2.new(
  access_key_id:     ENV["ACCESS_KEY_ID"],
  secret_access_key: ENV["SECRET_ACCESS_KEY"],
  ec2_endpoint:      ENV["EC2_ENDPOINT"]
)

print ec2.instances.select { |e|e.tags['Name'] =~ /vagrant/ }
                   .map { |e| { id: e.id, ip_address: e.ip_address, name: e.tags['Name'] } }
~~~

### <i class="fa fa-play" style="font-size:1em;"></i> 実行

~~~bash
$ bundle exec ruby read_ec2_instance_id_and_key.rb
[{:id=>"i-some_id", :ip_address=>"your_ip_address", :name=>"vagrant_aws_test_20141216_224111"}]
~~~

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link" style="font-size:1em;"></i> [aws-sdk GitHub](https://github.com/aws/aws-sdk-ruby)
* <i class="fa fa-book" style="font-size:1em;"></i> [aws-sdk API Document](http://docs.aws.amazon.com/AWSRubySDK/latest/frames.html)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [dotenv GitHub](https://github.com/bkeepers/dotenv)