前回はCloudWatchで、基本メトリクスを使って監視をすることができました。
後編の今回はカスタムメトリックスを使った監視を行ってみたいと思います。
カスタムメトリックスでの監視の流れ
大まかな流れとしては以下の通りです。
- 監視したい項目に対する値を取得する
- CloudWatchに送信する
- CloudWatch側で値を解釈して適宜アラートメールを送信する
では、まず準備から行っていきます。
事前準備
aws-apitools-monのインストール
Cloudwatchへ値を送信するためのaws-apitools-monが必要ですのでインストールされているか確認します。
Amazon Linuxでは初期インストールされているようですね。
1 2 |
# rpm -qa | grep aws-apitools-mon aws-apitools-mon-1.0.20.0-1.0.amzn1.noarch |
なければyumコマンドでインストールしておきます。
1 |
# yum install aws-apitools-mon |
IAMでポリシーの作成
IAMのポリシーから、ポリシーの作成をクリックします。
Policy Generatorをクリックします。
AWSサービスから Amazon CloudWatchを選択しAmazonリソースネームからPutMetricDataをチェックし、分かりやすい名前を付けて保存しておきます。
今回は「CloudWatchPutMetricData」として保存しました。
CloudWatch用IAMユーザーの作成
次にCloudWatchへ値を送信可能なIAMユーザーを作成します。
IAMからユーザーをクリックし、新規ユーザーの作成に進みます。
ユーザー名は何でも良いのですが、分かりやすく「cloudwatch」としました。
ユーザー作成後に認証情報をダウンロードしておきます。AWSAccessKeyIdとAWSSecretKeyが後程必要になります。
先ほど新規作成したポリシー「CloudWatchPutMetricData」をアタッチしておきます。
作成したユーザーをEC2インスタンスに設定
テンプレートを使って先ほど作成したユーザーの認証情報を記述しておきます。
1 2 3 4 5 6 7 8 9 |
# mkdir /root/cloudwatch # cd /root/cloudwatch/ # cp -a /opt/aws/credential-file-path.template /root/cloudwatch/credentials # chmod 600 credential # vi credential ----------------------------------------------------- AWSAccessKeyId=XXXXXXXXXXXXXXXXXX AWSSecretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ----------------------------------------------------- |
監視したい項目に対する値を取得する
さて、事前準備ができましたので監視設定を進めていきます。
良くあるケースとして、Apacheが正常稼働しているかどうかを監視する方法を考えてみたいと思います。
Apacheの死活監視を考える
Apacheのが正常に稼働しているかどうかを値によって判断すれば良いので様々な方法があると思いますが、以下のようにしてみました。
- Apacheの応答コードを取得する
- 応答コードが200であれば正常稼働とみなす
- 応答コードが200以外であれば異常とする
Apacheの応答コードを取得する方法
今回は単純にwgetを使ってApacheの応答コードを取得しました。
1 2 |
# wget -nv --spider [監視対象URL] 2>&1 2015-12-08 07:22:18 URL: [監視対象URL] 200 OK |
応答コードが200かどうかの判断
出力された結果を「200 OK」で検索し行数を取得します。
1 2 |
# wget -nv --spider [監視対象URL] 2>&1 | grep "200 OK" | wc -l 1 |
これで返り値が1であれば正常、0であれば異常であると判断できますね。
CloudWatchに送信する
上記の値を定期的にCloudWatchに送信します。
これを実現するには簡単なスクリプトを書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# vi /usr/local/sbin/cloudwatchput.sh -------------------------------------------------------- #!/bin/bash export AWS_CLOUDWATCH_HOME=/opt/aws/apitools/mon export AWS_CREDENTIAL_FILE=/root/cloudwatch/credentials export JAVA_HOME=/usr/lib/jvm/jre instanceid=xxxxxxxx (使用するEC2インスタンスのID) ################ # Apache Check # ################ apachestatus=`wget -nv --spider [監視対象URL] 2>&1 | grep "200 OK" | wc -l` /opt/aws/bin/mon-put-data --metric-name "Apache Status" --namespace "Linux" --dimensions "InstanceId=$instanceid" --value "$apachestatus" --region "ap-northeast-1" -------------------------------------------------------- # chmod 700 /usr/local/sbin/cloudwatchput.sh |
このスクリプトをCRONで実行します。今回はテスト的に1分間隔で設定しました。
1 2 |
MAILTO="" */1 * * * * /usr/local/sbin/cloudwatchput.sh |
CloudWatch側で値を解釈して適宜アラートメールを送信する
先ほど作成したカスタムメトリックスは正常にCloudWatch側に送信されていると図のようにカスタムメトリックスがメニューに表示された状態になります。
では前回と同じようにアラームを作成してみたいと思います。
先ほど作成したカスタムメトリックスを選択します。
アラームのしきい値としてApache Statusが0の時にアラームを出すように設定します。
無事追加できました。今回は警告だけですが、復帰した場合にも通知を受けたい場合には、別途状態復帰のアラートメールを設定してください。
CloudWatchの苦手分野
設定の仕方が分かれば、監視対象をどのように数値化するかを考えれば良いので後は発想だけだと思いますが、他の監視ツールを使用していると不満足な点もあります。
- データの保存期間が2週間だけであること
- メールフォーマットが変更できない
特にメールフォーマットの部分ですが、何故か私の手元のAndroidでアラートメールを受信したら、メール内容が真っ白で分からないという現象が発生してしまいました。
恐らくHTMLメールのせいだと思うのですが、このあたりが解消できないと使いづらいように感じました。
以上のことから本格的に運用監視する場合にはZabbix等の方がまだ良いように感じました。
まとめ
2回に渡ってお送りしたCloudWatchいかがでしたでしょうか。
次回の私の更新ではこのCloudWatchと連携できるWAFについて記事にしたいと考えております。