Amazon CloudFrontでは、アクセスログを取得することができます。 アクセスログを分析することでWebビジネスに役立つインサイトを得ることができます。
このようにビジネス上の意思決定に役立つアクセスログですが、CloudFrontのアクセスログはそのまま分析すると分析にかかるコストが高くなる上、分析パフォーマンス(分析にかかる時間)も悪くなってしまいます。アクセスログはデータ量が多いため、多少の手間かけてでも分析用に最適化する価値があります。
この記事のシリーズでは、最初に、CloudFrontのアクセスログを分析するメリットとその課題について紹介します(第1回)。次に、アクセスログの分析の課題を解決するためにAWS Glueでログを最適化する方法を紹介します(第2回)。その後、Athenaで分析(第3回)する方法を紹介し、最後にBIツールであるQuickSightを使ってダッシュボードで可視化する方法(第4回)について解説します。
シリーズの一覧は以下の通りです。
- 第1回: Amazon CloudFrontのログを分析するメリットとその課題
- 第2回: AWS GlueでParquet化とパーティショニングを行う
- 第3回: Amazon Athenaで最適化されたログを分析する
- 第4回: Amazon QuickSightでログを可視化する
CloudFrontのアクセスログ
はじめに、CloudFrontのアクセスログから得られる情報をいくつか記載します。これらは、ビジネス及び技術的なインサイトを引き出し、改善に役立てることができます。
- アクセス元の地域: ユーザーがどの地域からアクセスしているかを知ることで、特定の地域に向けたコンテンツや広告の最適化が可能になります。
- リクエストの数: ウェブサイトの人気ページやコンテンツを特定できます。また、特定の時間帯や曜日におけるトラフィックの傾向を分析することができます。
- ユーザーエージェント: ユーザーが使用しているデバイスやブラウザを知ることで、ウェブサイトの互換性やユーザーエクスペリエンスの最適化に役立ちます。
- リファラー: 他のウェブサイトからのリンクを通じて訪問者がどのようにウェブサイトにたどり着いたかを把握できます。これにより、パートナーシップや広告戦略の効果を評価することができます。
- HTTPステータスコード: エラーやリダイレクトなどのHTTPステータスコードを分析することで、ウェブサイトのパフォーマンスや問題点を特定できます。
- キャッシュヒット率: CloudFrontのキャッシュ機能の効率を評価することができます。キャッシュヒット率が高いほど、コンテンツの配信が高速で、オリジンサーバーへの負荷が軽減されます。
- データ転送量: データ転送量を分析することで、コンテンツの配信コストを管理し、最適化することができます。
例えば、時間帯、曜日別のリクエストの数からいつキャンペーンの通知をユーザーに送るべきかを判断することができます。 ユーザーが自社サイトを頻繁に訪れているタイミングの少し前に通知をすることでいつもよりも多くの流入を見込むことができるでしょう。
また、リファラーからどのウェブサイトから自社サイトに辿り着いたかが分かるので、複数の経路でキャンペーンや広告を行なっている場合、何が最も効果的なのかを測定することができます。
その他にもリクエスト数の多いコンテンツのキャッシュヒット率を見て、リクエストが多いのにキャッシュされていないコンテンツがあれば、設定を改善するといった使い方などログから取れるアクションは多数あります。
CloudFrontには合計33個のカラムがあります。カラム一覧はAWSの公式ドキュメントで確認できます。
CloudFrontのアクセスログの課題
ここまででCloudFrontのログ分析が有用なことを見てきましたが、デフォルトのCloudFrontには主に2つの課題があります。 どちらの課題も多数のアクセスログを分析する際には、コストとパフォーマンスに悪影響を与えます。
パーティショニングされていない
CloudFrontのアクセスログはS3にフラットに保存されるため、日付などでパーティションが切られていません。
パーティションとは、データを論理的に分割して格納することを指します。S3では、これを実現するために、オブジェクトのキー名に特定のパターンを使用します。
例えば、次のように日付をキー名に含めることで、データをパーティション化することができます。この構造により、特定の日付のログファイルに絞って簡単にアクセスできるようになります。
date=2024-03-14/
date=2024-03-15/
date=2024-03-16/
パーティションを行うことで次のような利点が得られます。端的に言うとパーティションを区切ることで不要な範囲のファイルをスキャンせずに済むため、パフォーマンスとコストが改善します。
- パフォーマンスの向上: データをパーティションに分割することで、特定のクエリや操作が必要なデータセットのサイズを小さくすることができます。これにより、データの読み込みや処理のパフォーマンスが向上します。
- コストの削減: パーティションを使用すると、不要なデータをスキャンすることなく、必要なデータにのみアクセスできるため、データ転送や処理にかかるコストを削減できます。
例えば、Amazon AthenaでS3のデータをSQLでクエリする時に、Where句を使って範囲を絞ったとしてます。この時、上記のようにdate
でパーティションが作成されていれば、date=2024-03-15/
以下のファイルのみ読み取ることができます。
SELECT * FROM cloudfront_log WHERE date='2023-03-15';
一方で、CloudFrontのアクセスログはパーティションが区切られないため、同じSQLクエリを発行した場合、S3バケット内の全てのファイルを読み取りにいくことになります。これは、パフォーマンスとコストに悪影響を与えます。
全てのカラムが読み取られる
CloudFrontのアクセスログは、前述した通り33個ものカラム(列)がありますが、分析する際には全てのカラムは必要ではありません。例えば、リファラーからアクセス元と日付の関係を調べるためには、Referer
と日付を表すdate
カラムだけあれば十分です。
しかしながら、CloudFrontのアクセスログはCSV形式であるため、特定のカラムだけ取得することはできず、33個のカラム全てを読み取ってしまいます。
これを解決するには、Parquetのような列志向のフォーマットを用いる必要があります。
列志向とは、データが列ごとに格納されることを意味します。Parquestでは、列ベースのクエリ(特定の列のみを抽出するクエリなど)において高いパフォーマンスを提供します。これは、必要な列のみを読み込むことができ、無関係なデータの読み込みを避けられるためです。
また、Parquetはデータを効率的に圧縮し、エンコードすることができます。これにより、ストレージの使用量を削減し、I/Oのパフォーマンスを向上させることができます。Parquetは、データの特性に応じて複数の圧縮アルゴリズム(Snappy、GZIPなど)とエンコーディング手法をサポートしています。
CloudFrontのアクセスログをCSVからParquetに変換することでログファイルの中で必要なカラムだけ読み取ることができ、パフォーマンスとコストが改善します。
ここまでの最適化の方法をまとめると以下の画像のようになります。①パーティショニングで必要なファイルのみ読み取り、②Parquet化でファイル内の必要なカラム(列)のみスキャンすることで分析のパフォーマンスとコストを最適化します。
まとめ
本シリーズでは、CloudFrontのアクセスログを最適化し、コストパフォーマンスに優れた方法で分析する方法を解説します。
シリーズ1回目となる本記事では、CloudFrontのアクセスログから得られる情報の概要とビジネスでの活用方法について紹介しました。
また、CloudFrontのログを分析する際の課題と最適化する方法について解説しました。鍵となるのは、パーティショニングによりスキャン対象のログを絞ることと、Parquetフォーマット化によりファイル内で必要なカラムのみスキャンするように改善することです。
次回の 第2回: AWS GlueによるParquet化とパーティショニングでは、今回紹介した最適化をAWS Glueを使って行う方法を解説します。 AWS Glueは、データ分析の際に必要となるETL処理をサーバレスでで行えるサービスです。Glueでは、PySparkによる効率の良いETL処理を行えますので、次回は実際に利用するPySparkのコードも掲載し解説を行います。