CloudWatch Logs Insights でApacheのアクセスログを確認する

CloudWatch Logs Insightsを使って、Apacheのアクセスログを集計する方法をご紹介します。Insightsを使うことで、CloudWatch Logグループにクエリを実行したり、クエリの結果を可視化できます。

直近、25件のログを表示する

事前準備としてCloudWatch Logsの設定を行い、/var/log/httpd/access_logをCloudWatch Logsに転送しておきます。CloudWatchコンソールからインサイトを選択し、ロググループを選択します。apacheのアクセスログである/var/log/httpd/access_logを選びました。ロググループは複数選択できます。

検索範囲を指定します。1時間といった相対値と10/1 00:00〜10/1 23:59といった絶対値が指定できます。

サンプルクエリを実行します。サンプルクエリから25件のイベントを表示するクエリを選びます。

クエリが自動的に入力されるので、実行します。

fields @timestamp, @message
| sort @timestamp desc
| limit 25

ログが表示されます。

ログをパースする

右メニューからparseを選ぶと、parseとstatsが追加されます。

parseとsortだけ残して実行します。

parse '* - * [*] "* * *" * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes
| sort dateTimeString desc

パースされて表示されます。

よく見ると、bytesがうまくパースされていません。

EC2の/etc/httpd/conf/httpd.confには、以下のようにログフォーマットが書かれていました。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

クエリに*を2つとReferer,UserAgentを追加し実行します。

parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| sort dateTimeString desc

byte,Referer,UserAgentが分離されました。

特定のステータスコードのログだけ表示する

右メニューから"filter"を選択すると、filter行が追加されます。

filter行を変更し、statusCodeが400番台のログを検索します。

parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| sort dateTimeString desc
| filter statusCode like /(4\d\d)/

404のログが表示されました。

結果のダウンロード

クエリ結果はダウンロードできます。

ログ量を時系列で確認する

右メニューからstatsを選択するとstats行が追加されます。 以下のクエリを実行します。

parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| sort dateTimeString desc
| stats count() by bin(1m)

可視化タグを開くと、1min(1分)ごとのグラフが表示されます。縦軸がログ件数、横軸が時間です。検証環境のため、中途半端なグラフになっています。

CloudWatchダッシュボードに追加する

アクション>ダッシュボードに追加を選ぶと、CloudWatchダッシュボードに追加されます。以下のようなダッシュボードを作成できます。ログのエラー件数、アクセス数など重要な項目をまとめたダッシュボードを作るとはかどりそうです。

まとめ

CloudWatch Logs Insightsを使って、Apacheのアクセスログを集計する方法をご紹介しました。AWSコンソールから直感的にクエリを作成できる様子をご紹介できたと思います。クエリ結果はダウンロードできるほか、グラフにしたり、ダッシュボードに追加できます。OSログをCloudWatch Logsでログを退避するだけでなく、Insightsでの調査やモニタリングをご活用いただければと思います。

参考