CloudFrontのログクエリをやってみる(dateとtimeからJSTで検索する)

2 min read読了の目安(約1800字

概要

  • CloudFrontにおけるログをAthenaを使いクエリするといったことはよくあると思います。
  • その際にdate, timeのカラムから日付を絞りクエリする際にUTC時間を気にしなければなりません。
  • 今回は、そんな時に使うクエリをいくつか用意してみました。

AthenaにCloudFront テーブルを作成する

  • 下記のDDLステートメントをコピーしてAthenaのコンソール(クエリエディタ)に貼り付け(Run Query)をします。
  • ちなみに、下記のDDLは公式ドキュメントのものをそのまま引用しています。
CREATE EXTERNAL TABLE IF NOT EXISTS default.cloudfront_logs (
  `date` DATE,
  time STRING,
  location STRING,
  bytes BIGINT,
  request_ip STRING,
  method STRING,
  host STRING,
  uri STRING,
  status INT,
  referrer STRING,
  user_agent STRING,
  query_string STRING,
  cookie STRING,
  result_type STRING,
  request_id STRING,
  host_header STRING,
  request_protocol STRING,
  request_bytes BIGINT,
  time_taken FLOAT,
  xforwarded_for STRING,
  ssl_protocol STRING,
  ssl_cipher STRING,
  response_result_type STRING,
  http_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://CloudFront_bucket_name/CloudFront/'
TBLPROPERTIES ( 'skip.header.line.count'='2' )

クエリしてみる

  • 今回は2パターン用意しました。

①: 特定の日付(1日)のみに絞りクエリする

SELECT *
FROM cloudfront_logs
WHERE uri LIKE '%.mp4'
        AND ((date = CAST('2021-04-14' AS DATE)
        AND time >= '15:00:00')
        OR (date = CAST('2021-04-15' AS DATE)
        AND time < '15:00:00'));

②: 複数日付を指定し、その間にある条件でクエリする

SELECT *
FROM 
    (SELECT from_iso8601_timestamp(date_format(date,
         '%Y-%m-%dT') || time || 'Z') AT TIME ZONE 'Asia/Tokyo' jst_date, time, uri
    FROM cloudfront_logs
    WHERE "date"
        BETWEEN DATE '2021-02-01'
            AND DATE '2021-04-15'
    GROUP BY  date, time, uri)
WHERE "jst_date"
    BETWEEN DATE '2021-02-01'
        AND DATE '2021-04-15';