読者です 読者をやめる 読者になる 読者になる

AWS SDK for Rubyでインスタンスを起動/停止するスクリプト

AWS SDK for Rubyインスタンスをまとめて起動/停止するスクリプトを書きました。
特定の時間しか使わないインスタンスが複数あるのですが、これらをスケジュールにしたがってまとめて起動・停止するために、いままでCloudworksを使わせていただいていたのですが、スクリプトを書いてJenkinsから実行するようにしました。

まず、AWS SDK for Rubyのインストールですが、gemでインストールできます。Ubuntuの初期状態だと、他にいくつか必要なパッケージがありました。

sudo apt-get install ruby-dev
sudo apt-get install libxslt-dev libxml2-dev
sudo gem install aws-sdk

スクリプトは以下のようなものです。
複数のインスタンスをまとめて操作するために、あらかじめAWS Console等で対象のインスタンスに"Group"というTagでグループ名を指定しておきます。

# -*- coding: utf-8 -*-

require 'rubygems'
require 'yaml'

require 'aws-sdk'

COMMAND=["start", "stop", "list"]

unless ARGV.size == 2
  puts "Usage: #{$0} <target_group> <command(#{COMMAND.join('/')})>"
  exit 1
end

target_group = ARGV[0]
command = ARGV[1]
unless COMMAND.index(command)
  puts "command must be #{COMMAND.join(' or ')} !"
  exit 1
end

puts "#{command} instances in #{target_group}."

config = YAML.load(File.read("config.yml"))
AWS.config(config)

AWS::EC2.new.instances.tagged("Group", target_group).each{ |i|
  puts "#{i.id}(#{i.tags['Name']}) => #{i.status.to_s}"
  if command == 'start' && i.status == :stopped
    puts "start instance"
    i.start
  elsif command == 'stop' && i.status == :running
    puts "stop instance"
    i.stop
  end
}

実行にはスクリプトと同じフォルダにconfig.ymlというファイルを作成して認証情報とリージョンを指定します。

access_key_id: YOUR_ACCESS_KEY_ID
secret_access_key: YOUR_SECRET_ACCESS_KEY
ec2_endpoint: ec2.ap-northeast-1.amazonaws.com

"test"というグループのインスタンスを起動する場合には以下のように実行します。

ruby run_instance_by_group.rb test start

start instances in test.
i-XXXXXXXX(instance1) => stopped
start instance
i-XXXXXXXX(instance2) => stopped
start instance
...

stopにするとインスタンスは停止します。listはデバッグ用でインスタンスのライフサイクルを表示します。
インスタンスが"running"になるのに少し時間がかかるので("pendding")、直後にインスタンスを使って操作するのであれば、runningになるまで待つようにした方がいいかもしれません。