ぼくらの研究

ぼくらのための研究をしていきます。

[Rails]aws-sdkを使ってEC2インスタンスの自動起動、自動停止を行う

   

確認環境

EC2: t2.small
Linux OS: Amazon Linux(Linux version 4.9.32-15.41.amzn1.x86_64)
Rails: 5.0.0.1
Ruby: ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin16]

前提

・RailsをインストールしたEC2インスタンス作成済み(起動コマンドを出す側)
・EC2インスタンス作成済み(起動コマンドを受け取る側)

方法

aws-sdkのインストール

Gemfileに


gem 'aws-sdk'

と追記して


bundle install

を実行。

IAMユーザーの作成

以下のAWS公式ドキュメントを参考にIAMユーザーを作成しましょう。

参考URLAWS アカウント内での IAM ユーザーの作成

以下のアクセス権限をポリシーにアタッチしてください。

・AmazonEC2FullAccess

指定したEC2インスタンスを起動するコード


require 'aws-sdk'
#↓インスタンスidを入力
instance_id = 'i-xxxx'
#↓regionにはリージョン、access_key_idにはIAMのアクセスキー、secret_access_keyにはIAMのシークレットアクセスキーを設定
ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1',access_key_id: 'XXX',secret_access_key: 'XXX')
i = ec2.instance(instance_id)
if i.exists?
 case i.state.code
 when 0 # pending
 puts "#{id} is pending, so it will be running in a bit"
 when 16 # started
 puts "#{id} is already started"
 when 48 # terminated
 puts "#{id} is terminated, so you cannot start it"
 else
 i.start
 end
end

※アクセスキーとシークレットアクセスキーはソースコードに直接書くこともできますが、推奨しません。外部から参照した方はよりセキュアです。

指定したEC2インスタンスを停止するコード


require 'aws-sdk'
#↓インスタンスidを入力
instance_id = 'i-xxxx'
#↓regionにはリージョン、access_key_idにはIAMのアクセスキー、secret_access_keyにはIAMのシークレットアクセスキーを設定
ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1',access_key_id: 'XXX',secret_access_key: 'XXX')
i = ec2.instance(instance_id)
if i.exists?
 case i.state.code
 when 48 # terminated
 puts "#{id} is terminated, so you cannot stop it"
 when 64 # stopping
 puts "#{id} is stopping, so it will be stopped in a bit"
 when 89 # stopped
 puts "#{id} is already stopped"
 else
 i.stop
 end
end

※アクセスキーとシークレットアクセスキーはソースコードに直接書くこともできますが、推奨しません。外部から参照した方はよりセキュアです。

指定した複数のEC2インスタンスを起動するコード

require 'aws-sdk'
instance_ids = ['i-xxxx','i-xxxx','i-xxxx']
instance_ids.each do |instance_id|
 ec2 = Aws::EC2::Resource.new(region: 'ap-northeast-1',access_key_id: 'XXX',secret_access_key: 'XXX')
 i = ec2.instance(instance_id)
 if i.exists?
 case i.state.code
 when 0 # pending
 puts "#{id} is pending, so it will be running in a bit"
 when 16 # started
 puts "#{id} is already started"
 when 48 # terminated
 puts "#{id} is terminated, so you cannot start it"
 else
 i.start
 end
 end
end

※アクセスキーとシークレットアクセスキーはソースコードに直接書くこともできますが、推奨しません。外部から参照した方はよりセキュアです。

 

指定した時刻にaws-sdkを使ったEC2操作(起動、停止等)を行う

あとはwheneverなどのgemを使えば、cronから指定した時刻に自動起動、自動停止が可能です。

参考URLRailsで定期的にバッチ回す「Whenever」

以上、参考になれば幸いです。