DRY

Web関連の技術の事、食事/お酒の事、旅行の事など

AWSのCloudWatchでカスタムメトリックスを使用する

AWSのCloudWatchでカスタムメトリックスを使用する方法です。
(何番煎じになるのかな???w)

Webサーバにnginx + PHP-FPMを使ってるのでその監視とあとLoadAverageなどを追加したいのでCloudWatchをカスタマイズしました。
ずっと動かなくて困ったのですが、ミソはちゃんとRegionを伝える事でした。。。
export EC2_REGION」が楽ですね。

■参考サイト
Set Up the Command Line Interface - Amazon CloudWatch
Amazon CloudWatch で EC2 インスタンスのプロセス監視を行う - hiratake55 の開発メモ
[AWS]CloudWatchを使ってEC2を監視する方法 | 株式会社システムシンキング

■まずはCloudWatchを入手して適当な場所に配置します


wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
unzip CloudWatch-2010-08-01.zip
cd CloudWatch-1.0.13.4/

cp credential-file-path.template credentials
cd ../
cp -a CloudWatch-1.0.13.4 /opt/aws/cloudwatch
cd /opt/aws/cloudwatch

■credentilasファイルは自分のAmazon Web Services Sign Inから
Access Key ID」と「Secret Access Key」を取ってきて入れておきます。

■適当にshellファイルに名前をつけます
(結構参考サイトからそのまま頂いてます)


vi custom_metrics.sh

以下ファイルに記載します

                                                                                                                                                                • -

#!/bin/bash

export JAVA_HOME=/usr/lib/jvm/jre
export PATH=$PATH:$JAVA_HOME/bin
export EC2_REGION=us-west-1 #私は「N.Carifolnia」を使っているのでこれになります
export AWS_CLOUDWATCH_HOME=/opt/aws/CloudWatch
export PATH=$PATH:$AWS_CLOUDWATCH_HOME/bin
export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/credentials

#####Config###################
# 各InstanceId
InstanceId="各InstanceIDを入力します"

#nginx and php-fpm
nginxcnt=`ps cax | grep nginx | wc -l`
phpfpmcnt=`ps cax | grep php-fpm | wc -l`
let "allcnt=nginxcnt * phpfpmcnt"
if [ "$allcnt" -gt "0" ]; then
Processes=1
else
Processes=0
fi

#Memory
memtotal=`free -m | grep 'Mem' | tr -s ' ' | cut -d ' ' -f 2`
memfree=`free -m | grep 'buffers/cache' | tr -s ' ' | cut -d ' ' -f 4`
let "memused=100 - memfree * 100 / memtotal"

#LoadAverage
loadave1=`uptime | tr -s ' ' | cut -d ' ' -f 11 | cut -d ',' -f 1`
steal=`vmstat | tail -1 | tr -s ' ' | cut -d ' ' -f 18`

#diskUsage
l_num=1
disk_max=0
df_result=/tmp/disk_usage.txt
disk_describe=/tmp/disk_describe.txt

if [ -a $df_result ]; then
rm -f $df_result
fi

df -k>$disk_describe

exec 3<$disk_describe
while read FL 0<&3
do
if [ $l_num -eq 1 ] ; then
l_num=`expr $l_num + 1`
else
echo $FL | grep /dev/ | tr -s ' ' | cut -d ' ' -f 5 | sed -e s/%// >> $df_result
fi
done
exec 3<&-

while read LINE; do
if [ $disk_max -lt $LINE ] ; then
disk_max=`expr $LINE`
fi
done<$df_result

#####Execute###################

#nginx and php-fpm
echo 'nginx and php-fpm'
mon-put-data --namespace "Custom Metrix" --metric-name "Nginx Processes" --dimensions "InstanceId=$InstanceId" --value "$Processes" --unit "Count"

#FreeMemory
echo 'FreeMemory'
mon-put-data --namespace "Custom Metrix" --metric-name "FreeMemoryMBytes" --dimensions "InstanceId=$InstanceId" --value "$memfree" --unit "Megabytes"

#UsedMemoryPercent
echo 'UsedMemoryPercent'
mon-put-data --namespace "Custom Metrix" --metric-name "UsedMemoryPercent" --dimensions "InstanceId=$InstanceId" --value "$memused" --unit "Percent"

#LoadAverage
echo 'LoadAverage'
mon-put-data --namespace "Custom Metrix" --metric-name "LoadAverage" --dimensions "InstanceId=$InstanceId" --value "$loadave1" --unit "Count"

#Steal
echo 'Steal'
mon-put-data --namespace "Custom Metrix" --metric-name "Steal" --dimensions "InstanceId=$InstanceId" --value "$steal" --unit "Percent"

#DiskUsage
echo 'DiskUsage'
mon-put-data --namespace "Custom Metrix" --metric-name "DiskUsed" --dimensions "InstanceId=$InstanceId" --value "$disk_max" --unit "Percent"
echo $disk_max

                                                                                                                                                                • -

■一応権限設定して、cronで5分に一度動くよう登録しておきます


chmod 600 credentials
chmod 755 custom_metrics.sh

crontab -e
> */5 * * * * /opt/aws/cloudwatch/custom_metrics.sh

何回かshellを試し打ちして、AWSコンソールのCloudWatchのページを見るとviewingの部分に「Custom Metrix:InstanceId」みたいな
項目が増えていれば成功です。
(反映されるまでに5分10分ぐらい待ちました。逆にそれ以上反映されていないと失敗の可能性が高いのでスクリプトの再確認が必要です)
exportの変数などを見直してみてください。



mon-put-data: Malformed input-The value 各InstanceIDを入力します for parameter
MetricData.member.1.Dimensions.member.1.Value contains non-ASCII characters.
Usage:
mon-put-data
--metric-name value --namespace value [--dimensions
"key1=value1,key2=value2..." ] [--timestamp value ] [--unit value ]
[--value value ] [--statisticValues "SampleCount=value, Sum=value,
Maximum=value, Minimum=value" ] [General Options]
For more information and a full list of options, run "mon-put-data --help"
こんな感じのエラーが出たら、単純にmon-put-dataの展開後のコマンドが間違っているので
データの型とか不正な文字列が無いかなどを見直すと良いでしょう。

ここまで出来れば後はお好きなようにAlarmを設定する感じでしょうか。
画像の例では、例えばnginxサーバのLoadAverageとDiscUseに閾値を設定しています。