Amazon CloudFront ログのクエリ - Amazon Athena

Amazon CloudFront ログのクエリ

Amazon CloudFront CDN を設定して、ウェブディストリビューションのアクセスログを Amazon Simple Storage Service にエクスポートできます。これらのログを使用して、CloudFront によって提供されるウェブプロパティ全体でのユーザーのサーフィンパターンを調べます。

ログのクエリを開始する前に、使用する CloudFront ディストリビューションでウェブディストリビューションのアクセスログを有効にします。詳細については、「Amazon CloudFront デベロッパーガイド」の「アクセスログ」を参照してください。ログを保存する Amazon S3 バケットをメモしておきます。

CloudFront 標準ログ用テーブルの作成

注記

この手順は、CloudFront にあるウェブディストリビューションのアクセスログで機能します。RTMP ディストリビューションのストリーミングログには該当しません。

CloudFront 標準ログファイルフィールド用のテーブルを作成する

  1. 次の DDL ステートメントの例をコピーして Athena コンソールのクエリエディタに貼り付けます。例のステートメントでは、「Amazon CloudFront デベロッパーガイド」の「標準ログファイルフィールド」セクションに記載されているログファイルフィールドを使用しています。LOCATION をログを保存する Simple Storage Service (Amazon S3) バケットに変更します。クエリエディタの使用については、「開始」を参照してください。

    このクエリは、フィールドがタブ文字で区切られることを示すために ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t' を指定します。ROW FORMAT DELIMITED には、Athena がデフォルトで LazySimpleSerDe を使用します。列 date は Athena の予約語であるため、バックティック (`) を使用してエスケープされています。詳細については、予約済みキーワード を参照してください。

    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://DOC-EXAMPLE-BUCKET/' TBLPROPERTIES ( 'skip.header.line.count'='2' )
  2. Athena コンソールでクエリを実行します。クエリが完了すると、Athena が cloudfront_standard_logs テーブルを登録し、その中のデータに対してクエリを発行できるように準備します。

CloudFront リアルタイムログ用テーブルの作成

CloudFront リアルタイムログファイルフィールド用のテーブルを作成する

  1. 次の DDL ステートメントの例をコピーして Athena コンソールのクエリエディタに貼り付けます。ステートメント例では、「Amazon CloudFront 開発者ガイド」の「Real-time logs」セクションに記載されているログファイルフィールドを使用しています。LOCATION をログを保存する Simple Storage Service (Amazon S3) バケットに変更します。クエリエディタの使用については、「開始」を参照してください。

    このクエリは、フィールドがタブ文字で区切られることを示すために ROW FORMAT DELIMITEDFIELDS TERMINATED BY '\t' を指定します。ROW FORMAT DELIMITED には、Athena がデフォルトで LazySimpleSerDe を使用します。列 timestamp は Athena の予約語であるため、バックティック (`) を使用してエスケープされています。詳細については、予約済みキーワード を参照してください。

    以下の例には、利用可能なフィールドのすべてが含まれています。不要なフィールドは、コメントアウトまたは削除することができます。

    CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_real_time_logs ( `timestamp` STRING, c_ip STRING, time_to_first_byte BIGINT, sc_status BIGINT, sc_bytes BIGINT, cs_method STRING, cs_protocol STRING, cs_host STRING, cs_uri_stem STRING, cs_bytes BIGINT, x_edge_location STRING, x_edge_request_id STRING, x_host_header STRING, time_taken BIGINT, cs_protocol_version STRING, c_ip_version STRING, cs_user_agent STRING, cs_referer STRING, cs_cookie STRING, cs_uri_query STRING, x_edge_response_result_type STRING, x_forwarded_for STRING, ssl_protocol STRING, ssl_cipher STRING, x_edge_result_type STRING, fle_encrypted_fields STRING, fle_status STRING, sc_content_type STRING, sc_content_len BIGINT, sc_range_start STRING, sc_range_end STRING, c_port BIGINT, x_edge_detailed_result_type STRING, c_country STRING, cs_accept_encoding STRING, cs_accept STRING, cache_behavior_path_pattern STRING, cs_headers STRING, cs_header_names STRING, cs_headers_count BIGINT, primary_distribution_id STRING, primary_distribution_dns_name STRING, origin_fbl STRING, origin_lbl STRING, asn STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 's3://DOC-EXAMPLE-BUCKET/' TBLPROPERTIES ( 'skip.header.line.count'='2' )
  2. Athena コンソールでクエリを実行します。クエリが完了すると、Athena が cloudfront_real_time_logs テーブルを登録し、その中のデータに対してクエリを発行できるように準備します。

標準 CloudFront ログのクエリ例

以下のクエリは、2018 年 6 月 9 日から 6 月 11 日の間に CloudFront によって提供されたバイト数をCに で処理されたバイト数を集計します。date 列名は予約語であるため、二重引用符で囲みます。

SELECT SUM(bytes) AS total_bytes FROM cloudfront_standard_logs WHERE "date" BETWEEN DATE '2018-06-09' AND DATE '2018-06-11' LIMIT 100;

クエリ結果から重複する行 (重複する空の行など) を削除するには、次の例のように SELECT DISTINCT ステートメントを使用します。

SELECT DISTINCT * FROM cloudfront_standard_logs LIMIT 10;

追加リソース

Athena を使用した CloudFront ログのクエリについての詳細は、「AWS ビッグデータブログ」の以下の記事を参照してください。

Amazon Athena を使用して AWS のサービス ログを簡単にクエリする (2019 年 5 月 29 日)。

Amazon CloudFront のアクセスログを大規模に分析する (December 21, 2018 年 12 月 21 日)。

AWS Lambda、Amazon Athena、Amazon Managed Service for Apache Flink を使用して Amazon CloudFront アクセスログを分析するためのサーバーレスアーキテクチャを構築する (2017 年 5 月 26 日)。