Masteries

技術的なことや仕事に関することを書いていきます.

処理に時間がかかるスクリプトが終わった時にEC2インスタンスを止めるには

...という質問を, 会社の同期から受けました.

状況としては, 夜退社する前にEC2インスタンス上で処理に時間がかかるスプリクトを動かしていて, 朝に結果を確認しているのだけれど, スクリプトの処理が終わってから, 朝確認するまで無駄にEC2インスタンスが動いていて, もったいないので何とか出来ないか? とのこと.

ソリューション

こういう場合, awsコマンドとか, 或いはSDKを使って, プログラムが終わったタイミングで自分が動いているEC2インスタンスを止めてしまう, というのが1つの手だと思います.

awsコマンドであれば, EC2インスタンスのインスタンスIDがi-xxxxxxxxの場合,

$ aws ec2 stop-instances --instance-ids i-xxxxxxxx

のように止められるので, 同じインスタンスを使い回すのであれば, 処理に時間がかかるスクリプトの最後で, このコマンドを実行するようにしておけば良さそうです.

インスタンスIDについては,

$ curl http://169.254.169.254/latest/meta-data/instance-id
i-xxxxxxxx

このようにすれば取れるので,

$ aws ec2 stop-instances --instance-ids $(curl http://169.254.169.254/latest/meta-data/instance-id)

こういう感じにしてやれば, どのEC2インスタンスでスクリプトを動かしても, 処理が終わったタイミングで適切に自分自身のEC2インスタンスを停止してくれる, と思います.

まとめ

処理に時間がかかるスクリプトが終わった時にEC2インスタンスを止める方法について書きました. もっと良い方法をご存知の方は, 是非教えていただけると嬉しいです!