I wrote this script to monitor my Amazon EC2 servers and LoadBalancers, this script is able to get any metrics
avaiable at the cloud-watch. For it to work you will need the amazon api commands working, here is how to setup it.
Usage: ./check_aws.sh [–d DIMENSION] [–n NAMESPACE] [–t TYPE] [–p PERIOD] [–s STATS (Average|Sum)] [–w WARN] [–c CRITICAL] [-v|–verbose]
Example:
# sudo -u nagios ./check_aws.sh –d LoadBalancerName=master –n AWS/ELB –t RequestCount –p 300 –s Sum –w 1200 –c 1300 OK – LoadBalancerName=master RequestCount=412 |RequestCount=412
#!/bin/bash
#This script uses AWS command line tools to get information from Amazon CloudWatch metrics
#Should be used with nagios
#by Felipe Ferreira May 2013
#Requirements: AWS tools installed and working without asking for password (how to setup)
#Requirements-link = http://felipeferreira.net:81/?p=1341
#SET EC2 CMDS
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk.x86_64/
export AWS_AUTO_SCALING_HOME=/opt/AutoScaling
export AWS_CLOUDWATCH_HOME=/opt/cloudwatch
export PATH=$PATH:$AWS_AUTO_SCALING_HOME/bin:$EC2_HOME/bin:$AWS_CLOUDWATCH_HOME/bin
export AWS_AUTO_SCALING_URL=https://autoscaling.us-east-1.amazonaws.com
export AWS_CREDENTIAL_FILE=/opt/AutoScaling/key.txt
VERBOSE=0
outputDebug() {
if [ $VERBOSE -gt 0 ] ; then
echo -e "$1"
fi
}
if [ $# -eq 0 ] ; then
TEMP="-h"
else
TEMP=`getopt -o vh -l 'versbose,help,d:,n:,t:,p:,s:,w:,c:' -- "$@"`
fi
outputDebug "Processing Args $TEMP"
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-v|--verbose) VERBOSE=1 ; outputDebug "Verbose Mode ON" ; shift ;;
-h|--help) echo "Usage: $0 [--d DIMENSION] [--n NAMESPACE] [--t TYPE] [--p PERIOD] [--s STATISTC(Average|Sum)] [--w WARN] [--c CRITICAL] [-v|--verbose] " ; exit 0;;
--d) outputDebug "Option $1 is $2" ; DIMENSION=$2 ; shift 2;;
--n) outputDebug "Option $1 is $2" ; NAMESPACE=$2 ; shift 2;;
--t) outputDebug "Option $1 is $2" ; TYPE=$2 ; shift 2;;
--p) outputDebug "Option $1 is $2" ; PERIOD=$2 ; shift 2;;
--s) outputDebug "Option $1 is $2" ; STATS=$2 ; shift 2;;
--w) outputDebug "Option $1 is $2" ; WARN=$2 ; shift 2;;
--c) outputDebug "Option $1 is $2" ; CRIT=$2 ; shift 2;;
--) shift ; break ;;
*) echo "Internal error! - found $1 and $2" ; exit 3 ;;
esac
done
CMD="mon-get-stats $TYPE --namespace '${NAMESPACE}' --statistics ${STATS} --period ${PERIOD} --dimensions '${DIMENSION}'"
outputDebug "Executing: \n $CMD"
RESULT=`eval ${CMD}|tail -n1|awk '{ printf "%.0f\n",$3}'`
outputDebug "Result of cmd is: $RESULT"
if [ $RESULT -gt $CRIT ]; then
echo "CRITICAL - $DIMENSION ${TYPE}=${RESULT} |$TYPE=$RESULT"
exit 2
elif [ $RESULT -gt $WARN ]; then
echo "WARNING - $DIMENSION ${TYPE}=${RESULT} |$TYPE=$RESULT"
exit 1
else
echo "OK - $DIMENSION ${TYPE}=${RESULT} |$TYPE=$RESULT"
exit 0
fi
