# EC2のインスタンスを作成
#   VPC
#   インスタンスはEBSタイプ
#   追加EBSをcreate & attach
#   EIPをallocate & associate & mount
#   インスタンス、EBSボリュームにはNameタグをつける
# 使用例
#   $ ruby run_instance.rb app01 m1.small 10.0.0.101 30

require 'aws-sdk'
require 'pp'

aws_config = {
  access_key_id:     'xxxxxx',
  secret_access_key: 'xxxxxx',
  region:            'ap-northeast-1'
}

if ARGV.size != 4
  puts "usage: #{$0} <hostname> <instance_type> <private_ip_address> <ebs_size>"
  exit 1
end
hostname, instance_type, private_ip_address, ebs_size = ARGV
ebs_size = ebs_size.to_i

key_name = 'mikeda_aws'
image_id = 'ami-5f840e5e' # Amazon Linux x86_64
vpc      = 'vpc-4c6f2825'
subnet   = 'subnet-456f282c'
security_group_ids = [ 'sg-d65d42ba', 'sg-b13bdade' ] # only 'default'
ebs_device = '/dev/sdb'

user_data = <<EOS
#!/bin/bash
sed -i "s/HOSTNAME=.*/HOSTNAME=#{hostname}/" /etc/sysconfig/network
mkfs.ext4 #{ebs_device}
mkdir /data
echo '#{ebs_device}    /data    ext4    defaults  0   0' >> /etc/fstab
reboot
EOS

AWS.config(aws_config)
ec2 = AWS::EC2.new

### インスタンス作成
puts "create instance"
instance = ec2.instances.create(
  image_id:           image_id,
  instance_type:      instance_type,
  key_name:           key_name,
  user_data: user_data,
  block_device_mappings: [
    {
      device_name: ebs_device,
      ebs: {
        volume_size: ebs_size,
      }
    }
  ],
  network_interfaces: [
    {
      device_index: 0,
      subnet_id: subnet,
      private_ip_address: private_ip_address,
      associate_public_ip_address: true,
      groups: security_group_ids
    }
  ]
)

while instance.status != :running
  puts "Launching instance #{instance.id}, status: #{instance.status}"
  sleep 10
end

### タグ設定
root_volume = instance.attachments['/dev/sda1'].volume
data_volume = instance.attachments[ebs_device].volume

ec2.tags.create(instance,    'Name', value: hostname)
ec2.tags.create(root_volume, 'Name', value: "#{hostname}_root")
ec2.tags.create(data_volume, 'Name', value: "#{hostname}_data")