概要
本記事はAWS RUBY SDKを使ってEC2 インスタンスの状態管理と、そのメタデータの取得を行う一連の取り組みについて書いたものです。
詳しい内容などはaws sdk for ruby documentationを参照ください。
本記事ではAWS SDK FOR RUBY v3を使用します。
rubyのバージョンは2.3.1です。
対象:
AWS SDKを触るのが初めての方
インスタンスの状態管理を自動化したい方
目的:
社内向けのメモ
最初に
流れは以下のとおりです。
実装の流れ通りにかきます
- 認証系
- SDKを利用したEC2の操作方法
認証系
AWSのリソースにアクセスするためには、まずAWSの認証情報を作成する必要があります。
アカウントと紐付いて認証情報に権限が付与されるので欲しいリソースに応じたアカウントと紐付いた認証情報を使うようにしましょう。
AWSの認証情報のドキュメントによると,
認証情報は、アカウント内のすべてのリソースへのフルアクセスを許可します。ルートユーザー 認証情報のアクセス許可は制限できないため、ルートユーザー アクセスキーを削除することをお勧めします。
とのことですので、IAMユーザー認証情報を使うのがいいそうです。
当然ながら請求はIAMユーザーを持つルートユーザーに紐付けられるので、変なことをするのはやめましょう。
認証情報の取得
アクセスキーの作成は、IAMユーザーの管理画面から行うことができます。
各々ユーザーの管理画面を開き、認証情報を選択すると、アクセスキーの作成ボタンがあるので作りましょう。
このとき、シークレットは作成時しか取得できないので、メモするかcsvをダウンロードしておきましょう。
共有認証情報の作成
ローカルシステムにおいて、
~/.aws/credentials
に認証情報を作成する方法です。
先程取得したアクセスIDおよびシークレットキーを~/.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]})