【parse コマンド】【サンプルコマンドあり】CloudWatch Logs に出力した Apache アクセスログを CloudWatch Logs Insight で解析してみた

記事タイトルとURLをコピーする

はじめに

CloudWatch Logs に出力した Apache アクセスログ情報を、CloudWatch Logs Insight で解析する方法をまとめてみました。
parse コマンドの使い方も簡単に解説しているのでご参照ください!

まだ、Apache アクセスログを CloudWatch Logs に出力していないという方は以下をご参照ください

【AmazonLinux2】【amazon-cloudwatch-agent】最速で Apache のアクセスログを CloudWatch Logs にログ出力してみる

記事目安...10分

Apache アクセスログのログ形式について

Apache アクセスログの形式は、 デフォルト設定の以下を前提とします。(*1)

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

1. httpd バージョン 2.4.46-1* のデフォルト設定です。


今回は以下サンプルログが CloudWatch logs グループ に格納されている前提として、クエリを実行します。

  • サンプルログ1
103.xxx.xxx.xxx - - [14/Feb/2021:10:40:57 +0000] "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36"
  • サンプルログ2
172.xxx.xxx.xxx - - [14/Feb/2021:14:01:30 +0000] "GET /fuga.html HTTP/1.1" 200 5 "-" "curl/7.61.1"

parse コマンドによるログ加工について

CloudWatch Logs にインポートした Apache アクセスログは、各値が事前に項目分けされていないので、
parse コマンドでエフェメラルフィールド(=一時的な項目) を作成してからクエリを投げることが望ましいです。

〇 Apache ログの parse 例

| parse @message '* * * [*] "* * *" * "*" "*"' as srcIpAddress, srcUser, remoteUser, timestamp, httpMethod, requestUri, protocol, statusCode, transferredData,referer, userAgent

参考: CloudWatch Logs Insights クエリ構文 - Amazon CloudWatch Logs

クエリを投げてみた

アクセスログを parse した後、 requestUri が "/" かつ、statusCode が "2xx系" のアクセスを、送信元 IP ごとにカウントしてみます。

〇 サンプルクエリ

fields @message
| filter @logStream =~ /<ログストリーム名>/
| parse @message '* * * [*] "* * *" * "*" "*"' as srcIpAddress, srcUser, remoteUser, timestamp, httpMethod, requestUri, protocol, statusCode, transferredData, referer, userAgent
| filter requestUri = "/"
| filter statusCode =~ /2\d\d/
| stats count(*) as count by srcIpAddress
| sort count desc
| limit 10

〇 凡例
"ログストリーム名: i-08c0f578afa9xxxxx" の場合

fields @message
| filter @logStream =~ /i-08c0f578afa9xxxxx/
| parse @message '* * * [*] "* * *" * "*" "*"' as srcIpAddress, srcUser, remoteUser, timestamp, httpMethod, requestUri, protocol, statusCode, transferredData, referer, userAgent
| filter requestUri = "/"
| filter statusCode =~ /2\d\d/
| stats count(*) as count by srcIpAddress
| sort count desc
| limit 10

〇 結果

@message count
103.xxx.xxx.xxx 1

無事取得できましたね。

まとめ

Apache アクセスログの解析クエリについて触れました。

今回使用した parse コマンドは Apache アクセスログ以外の解析でも使用できる便利なコマンドなのでぜひ使ってみてください!

またよさげなクエリができたら追記します!

参考

CloudWatch Logs Insights クエリ構文 - Amazon CloudWatch Logs

菅谷 歩 (記事一覧)