📊

Contributor Insightsを使ってログを分析する

に公開

背景

弊社ではボットやクローラなどによる、過剰なサイトアクセスへの対応に追われているサービスが増えています。大量のリクエストがあった場合にサービスの可用性を保つ努力をするのはもちろんのこととして、悪質なリクエストを分析して必要な対応を行う労力を小さくする試みも必要です。

現状は、S3に保存されたある日付範囲のログからIPやUAをキーにして上位100のアクセスを集計するなどで悪質なリクエストであるかを判定しています。この方法はリアルタイムな対応ができない・ログ分析ツールの構築や学習にコストがかかるという欠点を抱えています。
このことから、もっと手軽にログを分析→可視化をするためのソリューションが必要であると考えました。

Contributor Insightsについて

AWS CloudWatchの機能として、Contributor Insightsというものがあります。これを使う事で、ログを分析して特定のキーについて集計を行いメトリクスとして表示することができます。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ContributorInsights.html
当初はこのサービスを知らなかったのですが、ソフトウェアデザインの5月号を読んでメトリクスのカーディナリーという概念を知り、検索で行きついたという感じです。

検証

実際にサービスを利用してみます。

CloudFront標準ログを用意する

まず、分析対象のログとしてCloudFrontの標準ログを用意します。
CloudFrontの構築は省きますが、簡単なS3オリジンのものを用意しhello.txtというファイルを配信するようにしました。作成の際にCloudWatch Logsへログを出力する設定を行います。

ログフォーマットにはjsonを使用します。

Contributor Insights Ruleを作成する

CloudFrontのデプロイ待ちをしている間に、Contributor Insightsのルールを設定します。
CloudWatch > Contributor Insightsからルールの作成ができます。
以下のように、作成したログのc-ipというキーをカウントで集計するようにします。

作成した直後は以下のような画面になります。

動作確認

それではCloudFrontにアクセスして、動作を確認します。abでリクエストを送ります。

ab -n 100 https://xxxxxxxxxxxxxxxx.cloudfront.net/hello.txt

リクエストを送った20~30秒ほどで以下のようにメトリクスが確認できました。

CloudWatchと同じような操作感でメトリクスを閲覧できそうです。アクセス数TOP100のIPを瞬時に確認できます。
また、この例においてはINSIGHT_RULE_METRIC('CloudFront-IPCount', 'MaxContributorValue')というMath Expressionを使うことで、一番リクエストの多いIPのリクエスト数をCloudWatch Metricsで見ることができます。右上のActionsからも遷移可能です。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ContributorInsights-GraphReportData.html
他にもユニークなContributorの数や平均値などもありますね。個人的にはパーセンタイルとかもあればうれしいなと思いました。

感想

ラベル付きメトリクスを生成するContributor Insightsの紹介をしました。
今まで知らなかったですが便利なサービスだと思いました✨
料金についても固定料金が0.5USD/月、ルールに一致する100万件ログイベントあたり0.02USD (us-east-1, 2025-04-24時点)と安価に使えそうです。
https://aws.amazon.com/jp/cloudwatch/pricing/

Discussion