AWS EC2インスタンス料金節約 ~停止忘れ時の自動停止スクリプトの導入~

サマリ

AWS EC2インスタンスを停止し忘れて無駄な料金が発生してしまうことありますよね。そんな方のためにEC2インスタンスを自動停止させる方法をご紹介します。いろいろやり方はあるかと思いますが、一例として、CentOS7で作成したEC2インスタンスの起動時間が一定の値を超えると停止コマンドを実行するスクリプトを作成し、それをcronにて定期実行させる仕組みを記載していますので、ぜひ参考にしてみて下さい。

自動停止スクリプト

まずはスクリプトを配置するためのディレクトリを作成し、そのディレクトリ配下にviコマンド等でシェルスクリプト(autostop.sh)を作成します。

[root@ip-172-31-81-212 ~]# mkdir script
[root@ip-172-31-81-212 ~]# vi ~/script/autostop.sh

/proc/uptimeファイルからEC2インスタンスの起動時間を取得し、起動時間が3時間(10800秒)を超えていたらshutdownコマンドを打つシェルスクリプトを記載します。catとawkコマンドで起動時間を取得しただけだと値が文字列になってしまうので、printfコマンドで文字列から整数値に変換しています。そのあとif文で判定するという処理内容になっています。

#!/usr/bin/bash
ec2uptime=`cat /proc/uptime | awk '{print $1}'`
ec2uptime=`printf '%.0f\n' $ec2uptime`
if [ $ec2uptime -gt 10800 ]; then
  /sbin/shutdown -h now
fi

シェルスクリプトの作成が完了したら実行できるように権限を変更してください。

[root@ip-172-31-81-212 ~]# chmod 755 ~/script/autostop.sh
[root@ip-172-31-81-212 ~]# ls -l ~/script/autostop.sh
-rwxr-xr-x. 1 root root 164 Feb  6 21:16 /root/script/autostop.sh

続いてスクリプトを実行してみて下さい。処理内容が分かるようにオプションで-xをつけて実行します。下記のようにエラーなく実行できていることを確認してください。

[root@ip-172-31-81-212 ~]# sh -x /root/script/autostop.sh
++ cat /proc/uptime
++ awk '{print $1}'
+ ec2uptime=2309.68
++ printf '%.0f\n' 2309.68
+ ec2uptime=2310
+ '[' 2310 -gt 10800 ']'

cron設定

続いてシェルスクリプトを自動実行するためにcron設定を追加しましょう。crontabコマンドで下記の通り編集してください。一例として5分間隔で実行する設定を入れています。

[root@ip-172-31-81-212 script]# crontab -e
*/5 * * * * sh /root/script/autostop.sh

[root@ip-172-31-81-212 ~]# crontab -l
*/5 * * * * sh /root/script/autostop.sh

まとめ

以上で自動停止の設定は完了となります。一定の時間以上起動していたら自動でshutdownコマンドが叩かれて不要な料金発生を防げるはずです。ただし問答無用で停止されてしまうので、長時間作業が予定されている場合はcrontabの設定を無効にしておくなどの対処を忘れないようにご留意下さい。AWSの仕組みを利用して自動停止することも可能ですが、Linux基礎知識の習得にもなるので本記事で紹介したようなやり方をしてみるのも良いかと思います。ぜひ参考にしていただければと思います。

参考文献

/proc/uptimeについて

コメント