Ruby
Rails
AWS

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

概要

本記事はAWS RUBY SDKを使ってEC2 インスタンスの状態管理と、そのメタデータの取得を行う一連の取り組みについて書いたものです。
詳しい内容などはaws sdk for ruby documentationを参照ください。

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

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

目的:
 社内向けのメモ

最初に

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

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

認証系

AWSのリソースにアクセスするためには、まずAWSの認証情報を作成する必要があります。
アカウントと紐付いて認証情報に権限が付与されるので欲しいリソースに応じたアカウントと紐付いた認証情報を使うようにしましょう。
AWSの認証情報のドキュメントによると,

認証情報は、アカウント内のすべてのリソースへのフルアクセスを許可します。ルートユーザー 認証情報のアクセス許可は制限できないため、ルートユーザー アクセスキーを削除することをお勧めします。

とのことですので、IAMユーザー認証情報を使うのがいいそうです。
当然ながら請求はIAMユーザーを持つルートユーザーに紐付けられるので、変なことをするのはやめましょう。

認証情報の取得

アクセスキーの作成は、IAMユーザーの管理画面から行うことができます。
各々ユーザーの管理画面を開き、認証情報を選択すると、アクセスキーの作成ボタンがあるので作りましょう。
このとき、シークレットは作成時しか取得できないので、メモするかcsvをダウンロードしておきましょう。
image.png
image.png

共有認証情報の作成

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

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

他にも、ハードコーディングなどや環境変数に指定しておいてコード内で取得する方法もあります。
詳しくはAWS 認証情報の設定
これを作成しておけば、SDKを使ってアクセスする際に特にコーディングしなくても自動で認証される様になります。

EC2の操作方法

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

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

作成

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]})

リージョンの全インスタンス取得

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

インスタンスの状態確認

i.state.code
=>
0: pending
16: running
32: shutting-down
48: terminated
64: stopping
80: stopped

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

指定したec2が指定の状態になるまで待ってくれる(起動時や作成時に使うと思います)

ec2.client.wait_until(:instance_status_ok "okになるまで", {instance_ids: [instance[0].id]})

その他もろもろの方法はこちら

SDK Amazon EC2 コード例