13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AWS CLIでCloudWatchのカスタムメトリックスとそのアラート設定

Last updated at Posted at 2014-09-16

参考にしたページ

EC2の起動時・停止時に処理を実行する方法
http://www.infoscoop.org/blogjp/2014/06/04/ec2-boot-stop-shell/

AWSのCloudWatchでカスタムメトリックスを使用する
http://d.hatena.ne.jp/ke-16/20130311/1363025895

##AWS CLIのインストール
pip install awscli でインストールするにはPython 2.6以降が必要だそうなので確認してください。
またpython-pipパッケージのインストールはEPELリポジトリが必要です。

yum install python-pip
pip install awscli

##AWS CLIの設定
aws configureで設定するのが通常なのですが、chefとかで管理した場合どうやるのかわからなかったので、ファイルに書いて、それを読み込む形で使ってます。

/path/to/config
[default]
aws_access_key_id=****
aws_secret_access_key=*****
region=ap-northeast-1

こんな感じの設定ファイルを用意して、、
使う時はシェルスクリプト内で読み込みます。

#!/bin/sh
export AWS_CONFIG_FILE=/path/to/config

##CloudWatchカスタムメトリクスの作成

ローカルIPのhttpに接続してステータスコードが200以外なら、Valueを1として通知。

http_status_check.sh
#!/bin/sh

export AWS_CONFIG_FILE=/root/aws/config
EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
URI=`curl -s http://169.254.169.254/latest/meta-data/local-ipv4`

# http status check
status=`curl -s http://${URI} -o /dev/null -w "%{http_code}"`
if [ ${status} -eq 200 ]; then
Fail=0
else
Fail=1
fi

aws cloudwatch put-metric-data \
--metric-name "HttpStatusfail" \
--namespace "Custom Metrix" \
--dimensions "InstanceId=$EC2_INSTANCE_ID" \
--value "$Fail" \
--unit "Count"

このファイルをcronに設定

*/5 * * * * root /root/aws/aws_status_check.sh

この状態でAWS CloudWatchの管理画面でデータが取れてる。

##CloudWatchカスタムメトリクスのアラート設定

(参考)EC2の起動時・停止時に処理を実行する方法
http://www.infoscoop.org/blogjp/2014/06/04/ec2-boot-stop-shell/

こちらのブログを参考にインスタンス起動時にアラートを設定、インスタンス終了時にアラート設定を削除するようにしました。

/etc/init.d/cloudwatch_alart
#!/bin/bash
# chkconfig: 2345 99 10
# description: Create & Delete CloudWatch Alarm

export AWS_CONFIG_FILE=/path/to/config

EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
prog=cloudwatch_alarm
lock=/var/lock/subsys/$prog

case "$1" in
  start)

      #HTTP STATUS CHECK
      aws cloudwatch put-metric-alarm \
      --alarm-name HttpStatusCheck-for-$EC2_INSTANCE_ID \
      --alarm-description "Alarm when HttpStatusCheck has a value of one for two periods" \
      --metric-name HttpStatusfail \
      --namespace "Custom Metrix" \
      --statistic Maximum \
      --dimensions Name=InstanceId,Value=$EC2_INSTANCE_ID \
      --period 300 \
      --unit Count \
      --evaluation-periods 2 \
      --threshold 1 \
      --comparison-operator GreaterThanOrEqualToThreshold \
      --alarm-actions arn:aws:sns:ap-northeast-1:**** \
      --insufficient-data-actions arn:aws:sns:ap-northeast-1:****

      touch $lock
      ;;
  stop)
      aws cloudwatch delete-alarms --alarm-names HttpStatusCheck-for-$EC2_INSTANCE_ID

      rm -f $lock
      ;;
  restart)
      ;;
  *)
      echo $"Usage: $0 {start|stop}"
      exit 2
esac

exit

サービスに追加したり自動起動設定としたりする

chmod 755 /etc/init.d/cloudwatch_alarm
chkconfig --add cloudwatch_alarm
chkconfig cloudwatch_alarm on

##以下はまったところ

###GreaterThanThreshold にしててエラーにならなかった

今回、200のステータスコード以外であれば「1」が記録される設定なのでcomparison-operatorGreaterThanOrEqualToThresholとします。

comparison-operatorにどんな設定ができるのかドキュメントで見つからなかったのですが
http://exploreaws.doorblog.jp/archives/24701093.html
のブログに詳細が書かれていたので助かりました。

###namespaceが"AWS/EC2"になっててアラートがinsufficient dataになってた
namespaceはカスタムメトリックスなので作成した時に指定したnamespaceと同じ "Custom Metrix"を指定します。"AWS/EC2"にしててステータスがinsufficient dataのままではまりました。

###insufficient dataもアラート扱いにする
Error時にアラート発信は当然なのですが、データが取得できない時の「insufficient data」時もアラートを発信するようにします。

###不明点
CloudWatchのアラートってアラート状態である限りアラートを発信し続けてくれる設定にできないのかな。

13
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?