はじめに
AWS EC2を使っていて、停止し忘れて余計な料金が発生してしまった経験はありませんか?
本記事では、AWS標準機能ではなく、Linuxのスクリプト + cron を活用し、
EC2が一定時間稼働していた場合に自動で停止する仕組みを構築する方法を解説します。
・AWSの仕組みを使わずに実装
・Linuxの基本操作やシェルスクリプトの学習にも最適
・検証環境の自動停止にも便利
例として、CentOS 7のEC2インスタンスで、起動から3時間経過したら自動停止する設定を作成します。
自動停止スクリプト
まずはスクリプトを配置するためのディレクトリを作成し、そのディレクトリ配下にviコマンド等でシェルスクリプト(autostop.sh)を作成します。
[root@ip-172-31-81-212 ~]# mkdir script
[root@ip-172-31-81-212 ~]# vi ~/script/autostop.sh
[root@ip-172-31-81-212 ~]# cat ~/script/autostop.sh
#!/bin/bash
# Get uptime in seconds (integer)
uptime_seconds=$(awk '{print int($1)}' /proc/uptime)
# Threshold: 3 hours = 10800 seconds
if [ "$uptime_seconds" -gt 10800 ]; then
/sbin/shutdown -h now
fi/proc/uptime ファイルから EC2 インスタンスの起動時間を取得し、起動時間が 3 時間(10,800 秒)を超えている場合に shutdown コマンドを実行するシェルスクリプトです。
cat と awk コマンドで取得した起動時間は小数を含む文字列として扱われるため、printf を使用して整数値へ変換しています。その後、if 文で起動時間を判定するという処理内容になっています。
シェルスクリプトの作成が完了したら実行できるように権限を変更してください。
[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
[root@ip-172-31-81-212 ~]#続いて、作成したスクリプトを実行して動作を確認します。
処理内容を確認できるよう、-x オプションを付けて実行してください。
以下のようにエラーが発生せず、正常に実行されていることを確認します。
[root@ip-172-31-81-212 ~]# sh -x ~/script/autostop.sh
+ awk '{print int($1)}' /proc/uptime
+ uptime_seconds=2450
+ '[' 2450 -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 の基本操作やスクリプト作成の学習にもなるため、今回紹介した手法も有効な選択肢です。ぜひ参考にしてみてください。


コメント