CloudWatchでEC2を監視する
カスタムメトリクス情報をCloudWatchへ送信し、閾値を過ぎたらメール送信します。
環境:amazon Linux 64bit
S3backet名 mnttest
※rootで作業
1. CloudWatchコマンドラインツールをダウンロードする
wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
2. ファイルを解凍する
unzip CloudWatch-2010-08-01.zip
3. アクセスID、シークレットアクセスキー情報を設定する
cd CloudWatch-1.0.13.4 cp credential-file-path.template credentials vi credentials AWSAccessKeyId=xxxxxxxxxxxxxxxxxxx AWSSecretKey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4. ダウンロードしたツールを任意のディレクトリに移動する
mv 展開したディレクトリ /etc/aws/CloudWatch #CloudWatch-1.0.13.4からCloudWatchへリネーム(任意) ※シェルに記載するディレクトリと整合性がとれれば、どのディレクトリでも問題ない
5. CloudWatchに情報を投げるシェルを作成する
※シェル名は何でも構いません。
今回はシェルを仕込んだサーバのデーモン起動(httpdとzabbix-agent)、空きメモリ(MB)、使用メモリ(%)、 ディスク使用量(%)をCloudWatchへ送信するシェルとする。 vi /etc/aws/CloudWatch/cloud_watch_reports.sh #!/bin/bash export AWS_CLOUDWATCH_HOME=/etc/aws/CloudWatch export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/credentials export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com export PATH=$AWS_CLOUDWATCH_HOME/bin:$PATH export JAVA_HOME=/usr/lib/jvm/jre ###Config### InstanceId=x-xxxxxxxx(対象のインスタンスID) #apache apached=`ps cax | grep httpd | wc -l` #zabbix_agent zabbixagentd=`ps cax | grep zabbix_agentd | wc -l` let "alld=apached*zabbixagentd" if [ "$alld" -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" #diskUsage l_num=1 disk_max=0 df_result=/etc/aws/CloudWatch/log/disk_usage.txt if [ $# -ne 1 ]; then echo "usage : cloudwatch_report.sh /etc/aws/CloudWatch/log/filename" exit 1 fi if [ -a $df_result ]; then rm -f $df_result fi df -k > $1 exec 3< $1 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### #mysql and apache mon-put-data --metric-name "httpd_zabbix agentd Processes" --namespace "cloudwatch/test" --dimensions "InstanceId=$InstanceId" --value "$Processes" --unit "Count" --region ap-northeast-1 #FreeMemory mon-put-data --metric-name "FreeMemoryMBytes" --namespace "cloudwatch/test" --dimensions "InstanceId=$InstanceId" --value "$memfree" --unit "Megabytes" --region ap-northeast-1 #UsedMemoryPercent mon-put-data --metric-name "UsedMemoryPercent" --namespace "cloudwatch/test" --dimensions "InstanceId=$InstanceId" --value "$memused" --unit "Percent" --region ap-northeast-1 #DiskUsage mon-put-data --metric-name "DiskUsed" --namespace "cloudwatch/test" --dimensions "InstanceId=$InstanceId" --value "$disk_max" --unit "Percent" --region ap-northeast-1
6. cronに登録し自動実行する
crontab -e */5 * * * * /etc/aws/CloudWatch/cloud_watch_reports.sh /etc/aws/CloudWatch/log/disk_describe.txt
ManagementConsoleを使って、CloudWatchの設定をします。
7. Management Consoleにログインし、「CloudWatch」をクリックする
8. Metricsをクリックする
9. Viewing:を「cloudwatch/test:InstanceId」に変更し値が取れていることを確認する
値が取れていることが確認できたら、アラームを設定して検知したらメールを送信する
設定をします。
今回の設定は、httpdプロセスが落ちた際にアラームが上がり、メールが送信されるような
設定とします。
10. Alarmsをクリックする
11. Create Alarmをクリックする
12. Viewing:を「cloudwatch/test:InstanceId」に変更する
13.「httpd_zabbix agent Prosess」を選択(クリック)し、Continueをクリックする
14. Name、Descripdptionとも任意の値を入れ、5分以上httpdのPresessが落ちたら検知という
設定を「<= 0 for 5 minutes」で表現しContinueをクリックする
15.メール送信設定として、Take actionを「Send Notification」に変更し、Topic、Email
それぞれに任意の値を入れ、「ADD ACTION」をクリックし設定反映し、Continueをクリックする
16.設定結果を確認する
17. 「Close」をクリックする
18. Management Console上でも反映されていることを確認する
19. テストのため、httpdサービスを停止する
service httpd stop
※検知されるまでしばらく待つ。
20. 設定したメールアドレスに送信されているかを確認する
21.Management Console上でも正しく動作していることを確認する