GCE(Google Compute Engine)で起動して一定時間後に自動でシャットダウンする方法


うっかりミスによるムダな課金を防ぎたい

GCEをビルドマシンとして使っています。
CPUコアの数やメモリサイズによって時間単価が異なるので、普段は1コアで使っていて重たいビルドをするときだけ4コアや8コアに切り換えて使っています。
貧乏性なので、8コアにしたまますっかり忘れて課金されるのが心配でたまりません。(まだ無料期間なのですが。)

そこで、一定時間後に自動でシャットダウンするスクリプトを作って、/etc/rc.local から起動するようにしました。

仕様

CPUのコア数でシャットダウンまでの時間を変える。
1個なら8時間、2個なら6時間、3個なら5時間、4個なら4時間、それ以外は3時間。

シャットダウンする60分前、15分前、5分前にwallコマンドで警告メッセージを表示する。

時間になったらシャットダウンする。念のため5分後にもシャットダウンする。

自動シャットダウンをキャンセルしたいときはそのスクリプトのプロセスをkill すればよい。

準備

rootユーザーで(sudo su を実行した状態で) Cloud SDKをインストールして、cloud コマンドが使用できるようにしておきます。
https://cloud.google.com/sdk/downloads?hl=ja

(2018.4.16 追記。)
Cloud SDKをインストールしなくても、単に shutdown -h now でシャットダウンすることができます。ただし、GCEのWeb UIにその状態が反映されるのに数分の遅延があります。
gcloud compute instances stopのコマンドでシャットダウンした場合は、Web UIにすぐに反映されます。

スクリプト

しくみは簡単で、sleepしてから何かを実行するだけ。
今後改変すると思うので、gistに貼っておきます。
https://gist.github.com/tetsu-koba/d1dbefac761aea5bc5c402c1465db04b

このファイルを/root/autoshutdown.sh で保存して、/etc/rc.local からこれを実行するようにします。

コメント歓迎

なにかもっといい方法があれば。

最初はatコマンドでやろうとしたけど、これだと時間になる前に手動でリブートしたときにもその時刻にシャットダウンするという情報が残ったままになってしまうのでよくなかった。