[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ユーザーを作成しましょう。
以下のアクセス権限をポリシーにアタッチしてください。
・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」
以上、参考になれば幸いです。