業務で夜間に開発系のサーバを停止させて翌朝起動させたかったり、GPUインスタンスの停止漏れを防ぐために毎日夜間に停止させたりと、ニーズが高まったので方法を調べた結果を残しておきます。
この記事に画面キャプチャを載せて一から手順を書くよりも公式のヘルプページの方が確実ですので、概要は以下を御覧ください。そこまで難しい手順は無く、特にGCPについてはgcloudコマンドをコピペで実行していくだけで、ほぼほぼできあがります。
ただし、AWSについてはインスタンスIDを直接指定ではなく、GCPのようにタグを使った方式にしたかったのと、PythonではなくRubyで実装したかったので、上記手順とはやや違うことをやりました。
こちらについては後日アップデート予定です。
追記(2020年6月10日)
AWSについてはインスタンスIDを直接指定ではなく、GCPのようにタグを使った方式にしたかったのと、PythonではなくRubyで実装したかった
Lambdaのソースコードはこちらになります。タグで制御できると運用が楽になるのでおすすめです!
require 'aws-sdk'
def lambda_handler(event:, context:)
msg = start_instance
{ statusCode: 200, body: JSON.generate(msg) }
end
def start_instance
ec2 = Aws::EC2::Resource.new(region: [リージョン])
msg = ""
ec2.instances({filters: [{name: 'tag:タグkey', values: [[タグvalue]]}]}).each do |i|
name = i.tags.find { |v| v[:key] == "Name" }[:value]
msg += "Instance:#{name}(#{i.id}) is "
case i.state.code
when 0 # pending
msg = msg + "pending, so it will be running in a bit."
when 16 # started
msg = msg + "already started."
when 48 # terminated
msg = msg + "terminated, so you cannot stop it."
else
msg = msg + "stopped."
i.start
end
end
puts msg
msg
end