概要
Cloudwatchから主にCloudfront系を監視したくて
以下を参考にある程度、Zabbix側で自由が効く形でのshell。
zabbixサーバにrubyとかpythonとか入れたくなかったってのもある。
Script
ポイント
- STATISTICSはzabbix側から呼ぶ時に、"-s Sum"とかになり、jqの所でエラーになるのでTrimしてる
- float桁数エラー対応で小数点第2位までで丸めてる。
- 開始時間は、渡された秒数でマイナス
- Cloudfrontはus-east-1でしか見れないのでしょうがなく渡してる
- 都合上、nullは困るので
if [ -z $res ]; then res="0"; fi
で0代入
#!/bin/bash
# ex) /usr/lib/zabbix/externalscripts/cloudwatch.sh -d "Name=Region,Value=Global Name=DistributionId,Value=xxxxxxx" -m Requests -s Average -n AWS/CloudFront -r us-east-1
export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PERIOD=300
REGION=ap-northeast-1
while getopts n:d:m:s:r:p: OPT
do
case ${OPT} in
n) NAMESPACE=${OPTARG} ;;
d) DIMENSIONS=${OPTARG} ;;
m) METRIC=${OPTARG} ;;
s) STATISTICS=${OPTARG//[[:blank:]]/} ;;
r) REGION=${OPTARG} ;;
p) PERIOD=${OPTARG} ;;
*) exit 1 ;;
esac
done
pointdate=`date "+%Y/%m/%d %H:%M:00"`
res=$(aws cloudwatch get-metric-statistics --region ${REGION} --period ${PERIOD} \
--namespace ${NAMESPACE} \
--dimensions ${DIMENSIONS} \
--metric-name ${METRIC} \
--statistics ${STATISTICS} \
--start-time `date --iso-8601=seconds --date "${pointdate} ${PERIOD} sec ago"` \
--end-time `date --iso-8601=seconds --date "${pointdate} 0 minutes ago"` \
| /usr/bin/jq -r ".Datapoints[].${STATISTICS}" \
| head -1 \
| awk '{printf("%4.2f"), $1}' )
if [ -z $res ]; then res="0"; fi
echo $res
呼び出し例
/usr/lib/zabbix/externalscripts/cloudwatch.sh -d "Name=Region,Value=Global Name=DistributionId,Value=XXXXXXXXXXXXXX" -m Requests -s " Sum" -n AWS/CloudFront -r us-east-1
他留意点
- 外部チェック設定時は、更新間隔カスタマイズ → 定期設定 → 更新間隔: m0,30 とか、キリ良く動くようにしといた方が幸せかも
- なお、その際に更新間隔は0にする。
- 色々合算するならAverageじゃなくてSumで。
- 俺氏、Average合算したりして平均値じゃなくて中途半端な中央値的なの出して時間無駄にした