AWS RUBY SDKを使ってAWS ec2インスタンスの再起動, メタデータの取得を行う

# 概要
本記事はAWS RUBY SDKを使ってEC2 インスタンスの状態管理と、そのメタデータの取得を行う一連の取り組みについて書いたものです。
詳しい内容などは[aws sdk for ruby documentation](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/setup-config.html)を参照ください。

本記事ではAWS SDK FOR RUBY v3を使用します。
rubyのバージョンは2.3.1です。


対象：
　AWS SDKを触るのが初めての方
　インスタンスの状態管理を自動化したい方

目的：
　社内向けのメモ

# 最初に
流れは以下のとおりです。
実装の流れ通りにかきます


1. 認証系
2. SDKを利用したEC2の操作方法

# 認証系
AWSのリソースにアクセスするためには、まずAWSの認証情報を作成する必要があります。
アカウントと紐付いて認証情報に権限が付与されるので欲しいリソースに応じたアカウントと紐付いた認証情報を使うようにしましょう。
AWSの[認証情報のドキュメント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/root-vs-iam.html)によると, 
> 認証情報は、アカウント内のすべてのリソースへのフルアクセスを許可します。ルートユーザー 認証情報のアクセス許可は制限できないため、ルートユーザー アクセスキーを削除することをお勧めします。

とのことですので、IAMユーザー認証情報を使うのがいいそうです。
当然ながら請求はIAMユーザーを持つルートユーザーに紐付けられるので、変なことをするのはやめましょう。
## 認証情報の取得
アクセスキーの作成は、IAMユーザーの管理画面から行うことができます。
各々ユーザーの管理画面を開き、認証情報を選択すると、アクセスキーの作成ボタンがあるので作りましょう。
このとき、シークレットは作成時しか取得できないので、メモするかcsvをダウンロードしておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130582/5534dd5b-0721-5ee2-3b91-c483e8c18ec7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130582/0853af8d-6e77-5b91-ee93-add49a59dafa.png)



## 共有認証情報の作成
ローカルシステムにおいて、
`~/.aws/credentials`に認証情報を作成する方法です。
先程取得したアクセスIDおよびシークレットキーを`~/.aws/credentials`内に以下のように記述します。

```~/.aws/credentials
[default]
aws_access_key_id = <アクセスキーID>
aws_secret_access_key = <シークレットアクセスキー>
```

他にも、ハードコーディングなどや環境変数に指定しておいてコード内で取得する方法もあります。
詳しくはAWS [認証情報の設定](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide/setup-config.html)
これを作成しておけば、SDKを使ってアクセスする際に特にコーディングしなくても自動で認証される様になります。

## EC2の操作方法
最初にEC2のクライアントを作成します。

```ruby
require 'aws-sdk'
ec2 = Aws::EC2::Resource.new(region: "操作したいEC2があるAWSリージョン. tokyoであれば ap-northeast-1")
i = ec2.instance('ec2のinstance_id i-*****')
```

### 起動
```
i.start
```
### 停止
```
i.stop
```
### 再起動
```
i.reboot
```

### 作成
```ruby
require 'base64'

# User code that's executed when the instance starts
script = ''

encoded_script = Base64.encode64(script)

ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1')

instance = ec2.create_instances({
  image_id: 'IMAGE_ID',
  min_count: 1,
  max_count: 1,
  key_name: 'MyGroovyKeyPair',
  security_group_ids: ['SECURITY_GROUP_ID'],
  user_data: encoded_script,
  instance_type: 't2.micro',
  placement: {
    availability_zone: 'どっか'
  },
  subnet_id: 'SUBNET_ID',
  iam_instance_profile: {
    arn: 'arn:aws:iam::' + 'ACCOUNT_ID' + ':instance-profile/aws-opsworks-ec2-role'
  }
})

# wait_untilメソッドを使うことで、起動するまで待つことができます
ec2.client.wait_until(:instance_status_ok, {instance_ids: [instance[0].id]})

```

### リージョンの全インスタンス取得
```ruby
ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1')
# To only get the first 10 instances:
# ec2.instances.limit(10).each do |i|
ec2.instances.each do |i|
  puts "ID:    #{i.id}"
  puts "State: #{i.state.name}"
end
```

## メタデータの取得
### インスタンスの存在確認
```
インスタンスの存在確認：　i.exists? => true, false
```

### インスタンスの状態確認
```ruby 
i.state.code
=>
0: pending
16: running
32: shutting-down
48: terminated
64: stopping
80: stopped

# i.state.nameで右の名前が帰ります
```

### 指定したec2が指定の状態になるまで待ってくれる(起動時や作成時に使うと思います)
```ruby
ec2.client.wait_until(:instance_status_ok "okになるまで", {instance_ids: [instance[0].id]})
```



## その他もろもろの方法はこちら
[SDK Amazon EC2 コード例](https://docs.aws.amazon.com/ja_jp/sdk-for-ruby/v3/developer-guide)