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になるまで待つようにした方がいいかもしれません。