こんにちは、罰金の徴収担当の高橋です。
前回のOWAZP ZAPのつづきを書こうと思ったのですが、 AWS CLI + Amazon CloudWatchでエラーログの監視をしてみたので、紹介します。
エラーログ発生数の可視化
エラーログの発生している状況を簡単に検知・可視化することができないかと思い、 AWS CLI + CloudWatch + bashを使用して、エラーログがどれだけ発生しているのかを可視化してみました。
AWS CLI (Amazon コマンドラインインターフェース)とは
AWSのサービスをコマンドラインで使用するためのツールです。
今回はEC2で取得したデータをCloudWatchに送信するために使用します。
*1
Amazon CloudWatch とは
AWS上のリソースの監視を行うためのツールです。EC2やRDSのCPU使用率、ネットワーク転送量などの監視することができます。
しきい値を超えた場合に、アラートメールを送信することもできます。
デフォルトで監視対象になっていないものでも、APIを使うことでAmazon CloudWatchで監視できるようになります。
*2
エラー件数を数える仕組みは下記のとおりです。
- シェルが起動した時刻の1分前に発生していたエラーログの行数をカウント
- カウントした行数をAmzon CloudWatchのカスタムメトリックスとして送信する
実行環境の作成
環境
- EC2(CentOS6.4)
- Cloud Watch
- bash
- AWS CLI
*3
実行手順
AWS CLIの準備 http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.htmlを参考にAWS CLIをインストールする。
アクセスキーの取得 CloudWatchに値を送信する際に、アクセスキーが必要になるので、http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/ManagingCredentials.htmlを参考にアクセスキーを取得する
下記のシェルを配備
#!/bin/bash # AWS CLIを利用するための設定 export AWS_CLOUDWATCH_HOME=/root/CloudWatch-1.0.20.0 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 # ec2のインスタンスIDを取得 instanceid=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id` # 行数を数える日時の計算(今回は過去1分間のログ数) targettime=`date -d '-1 minutes' +"%a %b %d %H:%M"` errorcount=`grep "\$targettime" /var/log/httpd/error_log | wc -l` # CloudWatchに送信する mon-put-data --metric-name "ErrorLogCount" --namespace "System/Linux" --dimensio ns "InstanceId=$instanceid" --value "$errorcount" --unit "None" --region ap-nort heast-1
- cronの設定
* * * * * /home/ec2user/error_count.sh
- CloudWatchで見てみる AWSの管理コンソールからログインし、CloudWatchを見ると、
CloudWatchのAlert設定をすることで、エラーが一定以上になった場合に通知することも可能です。
AWS CLIがインストールされていればシェルスクリプトだけで、急激にエラーが増えたなどの状態を検知することができます。