こんにちは、ちゃりおです。
Cloudwatch Logs Insights便利ですね。
Apacheのアクセスログを見て、アクセス数の集計とかに使うことが多いです。
集計によく使うクエリをまとめてみます。
Cloudwatch Logs Insightsとは
CloudWatch Logs Insights では、Amazon CloudWatch Logs のログデータをインタラクティブに検索して分析できます。クエリを実行することで、運用上の問題に効率的かつ効果的に対応できます。問題が発生した場合は、CloudWatch Logs Insights を使用して潜在的原因を特定し、デプロイした修正を検証できます。
Cloudwatch Logs上にあるログに対して、クエリを実行してログ分析ができるサービスです。
各サーバに入って、コマンドを使えば同様の事ができますが
Cloudwatch Logs Insightsを使ったほうが圧倒的に手間が少ないです。
複数のロググループにクエリを実行することもできます。(2020/10時点では、同時に20)
CloudWatch Logs Insights を使用したログデータの分析
クエリ構文については下記のドキュメントにあります。
このドキュメントとサンプルを見ながら、クエリを書くことが多いと思います。
CloudWatch Logs Insights クエリ構文
Apacheのアクセスログを使ってアクセス数の集計
僕はアクセス数の確認とかに使うことが多いです。
count()を外せば、アクセス数の代わりにログを表示することができます。
parseについては、下記のサイトを参考にしました。
CloudWatch Logs Insights でApacheのアクセスログを確認する
アクセス数
parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| count()
IPアドレスごとのアクセス数
parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| stats count() as access_count by host
| sort access_count desc
特定IPからのアクセス数
parse '* - * [*] ""* * *"" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| filter host like /8.8.8.8/
| count()
特定URLへのアクセス数
parse '* - * [*] ""* * *"" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| filter url like "/hoge"
| count()
| filter url like “/hoge”
「not like」にすれば、hoge以外のアクセス数にすることもできます。
| filter url not like “/hoge”
特定ステータスコードのアクセス数
parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes,Referer,UserAgent
| sort dateTimeString desc
| filter statusCode like /(4\d\d)/
| count()
まとめ
CloudWatch Logs Insightsを使ったApacheのアクセスログの集計について紹介しました。
攻撃などがあった際に、どこのIPからどのくらいアクセスがあるのか調べるときによく使っています。
独自のクエリを使いますが、ドキュメントやサンプルもしっかりしているので不自由は感じませんでした。
Athenaでやるほうがクエリの自由度は高いです。
ただ、CloudWatch Logs Insightsのほうが手軽にできるので使い分けていきたいです。