CloudFrontのアクセスログをAthenaで解析する方法

スポンサーリンク
ハンズオン
スポンサーリンク

はじめに

本記事では、AWS CloudFront のアクセスログを AWS Athena を使って効率的に解析するハンズオンを紹介します。

CloudFront のアクセスログには、Webサイトやアプリケーションへのアクセスに関する重要なデータが含まれており、これを分析することで、どのコンテンツへのアクセスが多いか、どのIPアドレスからアクセスが多いかなどを把握できます。
分析した結果から人気のコンテンツの選定や、不正なアクセスがないかをチェックすることができます。

事前準備

以下を準備の上ハンズオンを実施してください。

  • 静的コンテンツを配信しているCloudFront(解析する分のログがあればOKです)
  • Athena実行ログの格納S3バケット

静的コンテンツを配信しているCloudFrontがない場合は以下を参考に設定してみてください。

生成AI×AWSでWebサイトを公開してみる

CloudFront+S3で静的コンテンツ配信、API Gatewayで動的情報を取得するWebサイト構築

環境構成

本ハンズオンの環境構成は以下です。

1. CloudFrontのログをS3に保存する設定

  1. CloudFrontディストリビューションの選択
  • AWS Management Console にログインし、CloudFront コンソール に移動します。
  • ログを有効にしたいディストリビューションを選択します。
  • 標準ログ記録がオンになっていなければ次の標準ログの有効化を実施してください。
  1. ログ設定の有効化
  • ログを有効化したいディストリビューションを選択し、「一般」タブを選択し、「編集」 から設定ページを開きます。
  • 「Standard logging」 の項目で 「オン」 をチェックし、ログを保存するS3バケットを指定します。
  • 保存先のパスとプレフィックスを設定し、「変更を保存」 をクリックします。

2. Athenaの初期設定

AWS Management Console にログインし、Athena コンソール に移動します。「クエリエディタを起動」をクリックします。

Athenaのクエリを実行したことがない場合、Athenaのクエリの実行ログの設定がされていないのでログの格納先の指定をします。実施済みの場合は次の3. Athenaでデータベースとテーブルを作成するに進んでください。

設定が必要な場合は、「最初のクエリを実行する前に、Amazon S3でクエリ結果の場所を特定する設定が必要があります。」と表示されます。「設定を編集」を選択してください。

以下を参考にログの格納先の設定をします。必要に応じてライフサイクルポリシーの設定をしてください。

3. Athenaでデータベースとテーブルを作成する

AthenaでCloudFrontを解析するためのデータベースとテーブルを作成します。

以下を実施して、データベースを作成します。データベース名は任意で構いません。

CREATE DATABASE 【データベース名】;

データベース作成後、左メニューのデータベース欄に作成したデータベースを選択し、以下のクエリを実行しCloudFront標準ログ用のテーブルを作成してください。(【S3バケット名】はCloudFrontの標準ログの出力先のS3バケット、プレフィックスの指定があればプレフィックスも含めて指定してください。)

CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_standard_logs (
  `date` DATE,
  time STRING,
  x_edge_location STRING,
  sc_bytes BIGINT,
  c_ip STRING,
  cs_method STRING,
  cs_host STRING,
  cs_uri_stem STRING,
  sc_status INT,
  cs_referrer STRING,
  cs_user_agent STRING,
  cs_uri_query STRING,
  cs_cookie STRING,
  x_edge_result_type STRING,
  x_edge_request_id STRING,
  x_host_header STRING,
  cs_protocol STRING,
  cs_bytes BIGINT,
  time_taken FLOAT,
  x_forwarded_for STRING,
  ssl_protocol STRING,
  ssl_cipher STRING,
  x_edge_response_result_type STRING,
  cs_protocol_version STRING,
  fle_status STRING,
  fle_encrypted_fields INT,
  c_port INT,
  time_to_first_byte FLOAT,
  x_edge_detailed_result_type STRING,
  sc_content_type STRING,
  sc_content_len BIGINT,
  sc_range_start BIGINT,
  sc_range_end BIGINT
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
LOCATION 's3://【S3バケット名】/'
TBLPROPERTIES ( 'skip.header.line.count'='2' )

クエリを実行

今回のハンズオンでは以下2パターンのクエリを実行します。

  • ①特定の拡張しを持つファイルごとのへのリクエスト数の表示
  • ②アクセス元のIPアドレスごとのアクセス数の表示

①特定の拡張しを持つファイルごとのへのリクエスト数の表示

今回は.htmlを拡張子に持つファイルへリクエスト数を表示してみます。以下のクエリを実行します。

SELECT cs_uri_stem, COUNT(*) AS requests
FROM cloudfront_standard_logs
WHERE cs_uri_stem LIKE '%.html'
GROUP BY cs_uri_stem
ORDER BY requests DESC
LIMIT 10;

結果

②アクセス元のIPアドレスごとのアクセス数の表示

今回は.htmlを拡張子に持つファイルへリクエスト数を表示してみます。以下のクエリを実行します。

SELECT c_ip, COUNT(*) AS requests
FROM cloudfront_standard_logs
WHERE cs_uri_stem LIKE '%.html'
GROUP BY c_ip
ORDER BY requests DESC
LIMIT 10;

結果

まとめ

このハンズオンでは、S3に保存されたCloudFrontのアクセスログをAthenaでクエリして解析する方法を紹介しました。この手法を活用することで、アクセス数の分析やセキュリティの監視が簡単に行えるようになります。

Athenaでは他にもS3のアクセスログ、VPCフローログ、CloudTrailのログなどを分析することができます。ぜひ、他のサービスのログでも解析をしてみてください。

タイトルとURLをコピーしました