satococoa's blog

主にサーバーサイド、Web 系エンジニアのブログです。Go, Ruby, React, GCP, ...etc.

rubyでEC2を立ち上げてみた

引き続き、AWSをいじっています。

さて、今日はEC2の立ち上げに初挑戦しようかな・・・としたところでなんとTokyoリージョンが使えるようになっていることを発見しました。(クラウドが日本に上陸)TLがしばらくお祭り騒ぎでしたw

なんというグッドタイミング、と思いつつさっそくAmazon Web Services ガイドブックの手順に沿ってManagement ConsoleでEC2の立ち上げ、IPアドレスの割り当て、EBSの作成とEC2へのアタッチ、PHPのテスト、と行いました。
本に掲載されていたAMIが無かったので適当にLAMPが最初から入っているAMIを選んでみました。

ここまでは順調にできたのでいよいよrubyから先ほど行った手順を実行します。
エラー処理などをちょっとはしょってしまいましたが、本に掲載されていたPHPコードを単にrubyに移植した程度ですんなりと動きました。
# coding: utf-8
require 'right_aws'
require 'yaml'
require 'logger'

config = YAML::load_file('../config.yml')
ACCESS = config['aws']['access']
SECRET = config['aws']['secret']
log = Logger.new(STDOUT)

ec2 = RightAws::Ec2.new(ACCESS, SECRET, :region => 'ap-northeast-1')

# EC2立ち上げ
instances = ec2.run_instances('ami-8e08a38f', 1, 1, ['default'],
                             "YOURKEYPAIR",'', nil, 't1.micro')

# インスタンスIDとインスタンスのアベイラビリティゾーンを取得
instance_id = instances[0][:aws_instance_id]
availability_zone = instances[0][:aws_availability_zone]

log.info("Instance ID: #{instance_id}, Availability Zone: #{availability_zone}")

# ステータスがrunningになるまでポーリング
running = false
begin
  state = ec2.describe_instances(instance_id)[0][:aws_state]
  if state == 'running'
    running = true
  else
    sleep 10
  end
  log.info("State: #{state}")
end until running

# IPアドレスの割り当て
ip = ec2.allocate_address
ec2.associate_address(instance_id, ip)
log.info("IP: #{ip}")

# 1GBのEBSボリュームを1つ作成し、IDを求める
ebs = ec2.create_volume(nil, 1, availability_zone)
ebs_id = ebs[:aws_id]
log.info("EBS ID: #{ebs_id}")

# EBSボリュームを割り当てる
ec2.attach_volume(ebs_id, instance_id, '/dev/sdf')
log.info("Mission Completed!")
メソッドの使い方(引数とか)がよくわからないときは、公式のAPIリファレンスを見ながらやるとメソッド名がAPIと対応しているのでわかりやすかったです。

せっかくなので後片付け(それぞれのリソース解放)のスクリプトも作りたかったのですが、今日はもう眠いのでギブアップです。またあとで・・・。