Apache
AWS
CloudWatch

Amazon CloudWatch で Apache の起動状態をモニタリングする

===

Amazon CloudWatch ではあらかじめいくつかのメトリクスが用意されており、それらに関しては特に追加の作業がなくてもモニタリングを開始できます。

また、CloudWatch Agent を使用すれば、デフォルトには無いメトリクス (Cdisk 使用率など) も計測できるようになります。

CloudWatch Agent で disk 使用率をモニタリングする方法はこちらで。

https://qiita.com/michimani/items/92c736e902c387715237

今回は、EC2 インスタンス内で動いている Apache の起動状態をモニタリングする方法についてのメモです。

この方法を使えば、Apache だけでなく、EC2 内で動いている各プロセスの起動状態をモニタリングできると思います。

前提

  • Amazon CLI がインストール済みで、aws コマンドが使える
  • EC2 インスタンスに CloudWatch を触るためのロールがアタッチされている
    ロールの内容については 以前の記事 で設定した CloudWatch Agent のロールが付与されていれば十分です

モニタリングまでの流れ

Apacheのプロセスをモニタリングするまでの流れは次のようになります。

  1. 起動中の httpd のプロセス数を数える
  2. aws cloudwatch put-metrics-data コマンドで、数えたプロセス数を CloudWatch に送信する

以上です。

これをセルスクリプトで作って cron で定期的に実行すれば、CloudWatch でモニタリング出来ます。

1. 起動中の httpd のプロセス数を数える

プロセス数については、下記のコマンドで取得します。

$ ps awux | grep -v grep | grep -w httpd | wc -l
6

Apache が起動しているかどうかが分かればいいので、この値をチェックして、0 なら 0 、1 以上 なら 1 を、CloudWatch に送信するようにします。

2. aws cloudwatch put-metrics-data コマンドで、数えたプロセス数を CloudWatch に送信する

aws cloudwatch put-metrics-data は、その名の通り CloudWatch にメトリクスデータを put するコマンドです。実際のコマンドは下記のようになります。

aws cloudwatch put-metric-data --metric-name process/httpd --namespace MyMetrics --value 1 --region ap-northeast-1 --unit Count --dimensions "InstanceId=xxxxxyyyyyzzzzz,ProcessName=httpd"

色々オプションが付いていますが、最低限これくらいは というオプションです。特に --dimensions については CloudWatch のコンソール上でどういう形で見たいか、によって変わってくるので適宜変更してください。

プロセスモニタリング用シェルスクリプト作りました

上の 1 と 2 を実行するシェルスクリプトを書きました。

michimani/put-process-status.sh

実行時にプロセス名 (Apache なら httpd) を渡すことで、そのプロセスが起動しているかをチェックできます。

cron でこのスクリプトを定期的に実行すれば、 CloudWatch でモニタリングできます。あとはその値によって、SNS でアラートを飛ばせば OK です。

## Check Apache status
*/5 * * * * sh /path/to/put-custom-metrics.sh httpd

CloudWatch のアラームはデフォルトで最小 5 分間隔でしか値のチェックが出来ません。なので、データの送信も 5 分間隔で良いと思います。その分、タイムラグが出てしまいますが。

必要であれば高解像度アラームを利用してより細かい間隔でチェックする事はできます。

また、このスクリプトでは 1 または 0 を送信しているので、アラームを作成する場合は 5 分間の 最低値 が 1 未満かどうか で設定すると良さそうです。