CloudWatchとlogmonでEC2 Linuxのログを監視する
CloudWatchはAWSで用意されている監視サービスで、パフォーマンスやシステムの状態を監視することができます。
このCloudWatchによる監視は数値の監視を対象としているため、一般的な監視ツールでよくある”ログ監視”をすることはできません。
※ここでの「ログ監視」は、ログファイルに出力されるメッセージをあらかじめ定義したパターンと比較して、マッチしていればアクションを起こすタイプの監視を意味するものとします。
そこで、今回はEC2 Linuxのログ監視をlogmonというツールとCloudWatchを組み合わせる形で実現してみます。
ログファイルを監視する方法
ログファイルの監視は昔から様々なツールで実現されてきました。
ここで、ログファイル監視を実現するための代表的な方式を挙げてみます。
logmon
logmonとは、IBMがサンプルとして公開しているシンプルなログファイル監視ツールです。
特徴としては、本体のPerlスクリプトが117行と非常に短いため、可読性・保守性が高く、カスタマイズが容易であることが挙げられます。
忘れてはいけないのは、1つのプロセスで複数のログファイルを監視できる点です。
伝統的なswatchを使うよりも複数のログファイルの監視を楽に実現できて便利です。
オリジナルのlogmonはver.1.2(20100411)を最後にアップデートされていませんが、
その後何名かの方が独自でパッチを書かれているのを見かけました。
- ログ監視ツール logmon (修正パッチつき) – パソコン鳥のブログ
- Amazon EC2でリアルタイムにログ監視をする – logmon – Developers.IO
- 一文字パッチでlogmonをログローテートに対応させる – $web->{note};
実はIBMのlogmonのページにはライセンスの記載がなかったため、使用・改変を躊躇していたのですが、下記のtweetを見つけたので大丈夫とのことです。
これを受け、主に自分で使う用途のために、上記のパッチを取り込んだバージョンをGitHubに置いておきました。
これで毎回手作業でパッチをあてる必要がなくなりますし、コミットログでオリジナルからの修正点を把握しやすくなりました。
EC2 LinuxのログをCloudWatchとlogmonで監視する
さて、本題のEC2 LinuxのログをCloudWatchとlogmonで監視する方法を考えます。
CloudWatchは数値の監視にしか対応していないため、少し工夫が必要になります。
例えば”単位時間の間にログファイルに出力されたメッセージがlogmonの監視にヒットした回数を登録する“というような形で、監視結果をCloudWatchに登録することができます。
ここで、logmonはログメッセージのリアルタイム監視、パターンの定義、アクションの実行の機能を持っているため、単体でも十分活用でき、必ずしもCloudWatchと組み合わせて使う必要はありません。
ただ、CloudWatchのマネジメントコンソールからログ監視の状況を把握したい、ログ監視とCloudWatchの機能を連携させて使いたい等の要望がある場合、logmonとCloudWatchを組み合わせて使うと便利です。
awscliのセットアップ
情報をCloudWatchに送信するためにawscliを使うため、あらかじめセットアップしておきます。
下記コマンドで、アクセスキー、シークレットキー、リージョンを設定します。
aws configure
logmonのセットアップ
次にlogmonをセットアップします。今回はあらかじめパッチをあてたlogmonをGitHubからcloneして使います。
git clone https://github.com/moomindani/logmon.git cd logmon ./setup.sh
また、後述の手順で使う一時ファイルをあらかじめ作成しておきます。
echo 0 > /tmp/logmon_count
logmon.confの設定
/var/log/messages に error または ERROR という文字列が出力されたことを検知し、検知回数を /tmp/logmon_count に出力するように設定します。
/etc/logmon/logmon.confを下記の通り編集します。
:/var/log/messages (error|ERROR) echo "<%%%%>" >> /var/log/logmon.log;logmon_count=`cat /tmp/logmon_count`;echo `expr $logmon_count + 1` > /tmp/logmon_count
では、logmonを起動します。
service logmon start
cronの設定
5分間隔で、/tmp/logmon_count に記録された検知回数を、awscliを使ってCloudWatchに送信した後、/tmp/logmon_countを初期化するように設定します。
crontab -e で下記の通り設定します。
*/5 * * * * aws cloudwatch put-metric-data --metric-name "error" --value `cat /tmp/logmon_count` --unit "Count" --namespace logmon --dimensions InstanceId=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`; echo 0 > /tmp/logmon_count
動作確認
では、/var/log/messages に error という文字列を含むログを意図的に出力してみます。
logger error_test
マッチしたメッセージについては、/var/log/logmon.logに出力するように設定してあるので、このファイルを確認することでlogmonが”error_test”を検知したことがわかります。
では、ログ出力を断続的に繰り返した後、CloudWatchの画面を見てみましょう。
意図した通り監視できていることが確認できました。