この記事は公開から1年以上が経過しています。内容が古い場合があるのでご注意下さい。

CloudWatchのメトリクスを定期的に取得して、その値の内容がある条件にマッチした時だけ、サーバで何か処理をしたいことがあります。
今回は、その方法について紹介します。

当てはまるユースケース

では、どういった時にそんなことがあるのかというと、例えば、(CloudWatchで監視している)メモリ使用率の値が10分間連続で95%以上の時にプロセス再起動などの任意の処理を走らせるようにする、といった感じです。

そういうことは、monitや自作スクリプトでやるのが簡単かと思ったんですが、下記のような理由から採用しませんでした。

  • 監視データをサーバ内に持たせたくない
    • 保存方法などを検討するのが面倒
  • 常駐プロセスを増やしたくない
    • 利用インスタンスタイプが小さくリソースが潤沢ではない為(汗)

導入方法

方法としては、上記のことを行うスクリプトを書いて、cronに登録するだけです。

スクリプト

スクリプトについては、下記を参考にさせて頂きつつ、部分的に変更しています。
Python版 AWS CLIでCloudwatchの情報を取得する

全体としては、次のようなスクリプト(cloudwath-alarm-driven.sh)を用意します。
28行目のif文で行う処理については、適宜変更してもらえればと思います。

#!/bin/sh
NAMESPACE=System/Linux
INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id`
NOW=`date -u "+%Y-%m-%dT%H:%M:%SZ"`
DATE_10M_AGO=`date -u -d "10 minute ago" "+%Y-%m-%dT%H:%M:%SZ"`
START_TIME_10M_AGO=${2:-$DATE_10M_AGO}
END_TIME=${3:-$NOW}
PERIOD=300
METRIC=${1:-MemoryUtilization}
THRESHOLD=95

MEM_UTILS=$(aws cloudwatch get-metric-statistics \
              --namespace ${NAMESPACE} \
              --metric-name ${METRIC} \
              --start-time ${START_TIME_10M_AGO} \
              --end-time ${END_TIME} \
              --period ${PERIOD} \
              --statistics "Average" \
              --dimensions Name=InstanceId,Value=${INSTANCE_ID} \
              --query "Datapoints[*].[Average]" \
              --output text)

MEM_UTIL_1=`echo $MEM_UTILS | cut -d" " -f1`
MEM_UTIL_2=`echo $MEM_UTILS | cut -d" " -f2`

if [ `echo "${MEM_UTIL_1} > ${THRESHOLD}" |bc` -eq 1 -a \
     `echo "${MEM_UTIL_2} > ${THRESHOLD}" |bc` -eq 1  ]; then
        /sbin/service <your-service> restart
fi

やっていることは単純で、

  • AWS CLIでCloudWatchから過去10分間の値を取得
  • 5分前と10分前の両方の値が閾値(変数THRESHOLD)よりも大きいか評価
  • 条件にマッチすれば、指定プロセスを再起動

というものです。

cron登録

次にスクリプトに実行権限を付けます

chmod +x cloudwath-alarm-driven.sh

最後にcronに登録します。
下記では10分間隔にしています。適宜好きなタイミングに変更してください。

*/10 * * * * /your-script-path/cloudwath-alarm-driven.sh

備考

参考にさせて頂いたページにも書かれていましたが、やはりCloudWatchから取得できるデータは時系列に並んでいませんでした。

その為、今回は時系列に並んでいることを意識しなくてもいいようにしています。
具体的には、取得できた値のどちらが5分前、10分前のものなのかを区別せずに、取得できた順にMEM_UTIL_1MEM_UTIL_2の変数に入れています。

AWS CLIについて

AWS CLIや適切な権限のIAM Roleの利用を前提にしていますので、それらについては、下記を参考にして頂ければと思います。
CloudWatchのカスタムメトリクスでCentOSのメモリ使用率を監視する

以上です。

関連記事:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です