Contributor Insightsを使ってログを分析する
背景
弊社ではボットやクローラなどによる、過剰なサイトアクセスへの対応に追われているサービスが増えています。大量のリクエストがあった場合にサービスの可用性を保つ努力をするのはもちろんのこととして、悪質なリクエストを分析して必要な対応を行う労力を小さくする試みも必要です。
現状は、S3に保存されたある日付範囲のログからIPやUAをキーにして上位100のアクセスを集計するなどで悪質なリクエストであるかを判定しています。この方法はリアルタイムな対応ができない・ログ分析ツールの構築や学習にコストがかかるという欠点を抱えています。
このことから、もっと手軽にログを分析→可視化をするためのソリューションが必要であると考えました。
Contributor Insightsについて
AWS CloudWatchの機能として、Contributor Insightsというものがあります。これを使う事で、ログを分析して特定のキーについて集計を行いメトリクスとして表示することができます。
当初はこのサービスを知らなかったのですが、ソフトウェアデザインの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からも遷移可能です。
他にもユニークなContributorの数や平均値などもありますね。個人的にはパーセンタイルとかもあればうれしいなと思いました。
感想
ラベル付きメトリクスを生成するContributor Insightsの紹介をしました。
今まで知らなかったですが便利なサービスだと思いました✨
料金についても固定料金が0.5USD/月、ルールに一致する100万件ログイベントあたり0.02USD (us-east-1, 2025-04-24時点)と安価に使えそうです。
Discussion