はじめに
開発サーバーをmicroタイプのインスタンスで何台も立ち上げてるのですが、塵も積もれば山となるといった感じで無視出来ないコストになっております。
立ち上げ間もないサービスなので、1円でもコストを下げるべく奔走しており、EC2は必要な時だけ立ち上げようと思いやってみました。
やりたい事
- 平日の8:00にEC2自動起動
- 平日の20:00にEC2自動停止
- 祝日は起動しない
前提
AWS CLIが使える状態
前準備
jqインストール
jkではないです。
curl -o /usr/bin/jq http://stedolan.github.io/jq/download/linux64/jq
パーミッションエラーが起きたらjqのパーミッション変更
chmod 755 /usr/bin/jq
シェルスクリプトの作成
今回はshelluser
というユーザーディレクトリ配下にec2.sh
というファイルで作成しました。
vi /home/shelluser/ec2.sh
以下内容を入力
コピペして、リージョンとインスタンスidを入れる部分だけ変えてください。
# リージョンの設定
readonly REGION='ap-northeast-1'
# 停止したいEC2インスタンスのIDを配列で保持
EC2_ID_ARRAY[0]='インスタンスIDを入れます'
EC2_ID_ARRAY[1]='インスタンスIDを入れます'
EC2起動と停止のスクリプト
#!/bin/sh
## 実行パラメータ
# --start (EC2起動)
# --stop (EC2停止)
# リージョンの設定
readonly REGION='ap-northeast-1'
# 停止したいEC2インスタンスのIDを配列で保持
EC2_ID_ARRAY[0]='インスタンスIDを入れます'
EC2_ID_ARRAY[1]='インスタンスIDを入れます'
# 祝日チェック 2016 (もっといい感じにしたい)
readonly HOLIDAY_2016='01/01','01/11','02/11','03/20','03/21','04/29','05/03','05/04','05/05','07/18','09/19','09/22','10/10','11/03','11/23','12/23'
# 今日をmm/ddで取得
today=`date '+%m/%d'`
# 祝日リストに今日が含まれるか?
if [ `echo $HOLIDAY_2016 | grep $today` ] ; then
echo "今日は祝日"
# 祝日は何もしない
exit
fi
# パラメータ未入力
if [ -z "$1" ] ; then
# 未指定
echo "パラメータ未入力"
# 強制終了
exit
fi
# パラメータの値がstartでもstopでもない
if [ $1 != '--start' -a $1 != '--stop' ]; then
echo "パラメータの値がおかしい"
# 強制終了
exit
fi
# 配列に格納したインスタンスIDをforループで展開 (インスタンスが増えたら${EC2_ID_ARRAY[x]}を増やしていく)
for instance in ${EC2_ID_ARRAY[0]} ${EC2_ID_ARRAY[1]}
do
# インスタンスのステータス確認
status=`aws ec2 describe-instance-status --instance-ids $instance --region $REGION | jq -r '.InstanceStatuses[].InstanceState.Name'`
# EC2インスタンス起動
if [ -n "$1" ] && [ $1 = '--start' ] ; then
# インスタンスのステータスが空(停止中)なら
if [ -z "$status" ] ; then
# 起動処理開始
aws ec2 start-instances --instance-ids $instance --region $REGION
fi
fi
# EC2インスタンス停止
if [ -n "$1" ] && [ $1 = '--stop' ] ; then
# インスタンスが稼働中なら
if [ -n "$status" ] && [ $status = 'running' ] ; then
# 停止処理開始
aws ec2 stop-instances --instance-ids $instance --region $REGION
fi
fi
done
テスト
起動コマンド
sh /home/shelluser/ec2.sh --start
停止コマンド
sh /home/shelluser/ec2.sh --stop
実行してEC2インスタンスが起動したり停止している事を確認してみてください。
cronの設定
手動実行のテストで問題無ければcronの設定をします。
crontab -e
# 朝8時にEC2起動
0 8 * * 1-5 sh /home/shelluser/ec2.sh --start
# 夜8時にEC2停止
0 20 * * 1-5 sh /home/shelluser/ec2.sh --stop
あとは実行されるのを待つだけです。
おわりに
サービスを作るのもエンジニアの仕事ですが、技術を使ってコストを削減するのも必要な仕事だなぁと再実感しました。