LoginSignup
20
14

More than 5 years have passed since last update.

平日の営業時間だけEC2を稼働させる

Posted at

はじめに

開発サーバーを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

あとは実行されるのを待つだけです。

おわりに

サービスを作るのもエンジニアの仕事ですが、技術を使ってコストを削減するのも必要な仕事だなぁと再実感しました。

20
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
14