AWSのt2.2xlargeをhibernationしながら常用する


AWSは、2018年末辺りから、インスタンスの休止(ハイバネーション)ができるようになりました。
しばらくは、Amazon Linuxでしか使えなかったのですが、2019年にUbuntuでも使えるようになり、必要な時だけ立ち上げ、終わったら休止というのができるようになりました。

たとえば、時間のかかるビルドをするときに、ビルドが終わったら休止しておけば、コストを抑えられますし、シャットダウンと違って、エラーの確認も再開後すぐにできます。

しかし、休止をAWS Consoleからするのでは面倒です。そのため、実行中のインスタンスから休止できるコマンドを作成します。

hibernate.sh
#!/bin/sh
aws ec2 stop-instances --instance-ids `curl -s 169.254.169.254/latest/meta-data/instance-id/` --hibernate

上記を実行中のインスタンスに置いて、パスを通してください。そして、hibernate.shを実行すると休止します。

これで、例えば、

$ make; hibernate.sh

などとすれば、ビルド後、休止します。make && hibernate.shとすると成功時にしか休止しないので、make; hibernate.shとすべきです。

ただ、上記だと、makeが一瞬で失敗してしまったときも、休止します。そのため、sleepを入れましょう。単にsleepを入れると分かりにくいのでカウントダウンのコマンドを作ります。

countdown.sh
secs=$1
while [ $secs -gt 0 ]
do
        sleep 1 &
        printf "\r%02d:%02d:%02d" $((secs/3600)) $(( (secs/60)%60)) $((secs%60))
        secs=$(( $secs - 1 ))
        wait
done
echo

そして、hibernate.sh でcountdown.shを呼びですようにします。以下では10分待っています。

hibernate.sh
#!/bin/sh
countdown.sh 600 && aws ec2 stop-instances --instance-ids `curl -s 169.254.169.254/latest/meta-data/instance-id/` --hibernate