4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFrontの標準ログ (アクセスログ)をCloudShellとDuckDBで気軽に分析する

Posted at

背景

CloudFrontのログはS3に保存されますが、そのままでは分析しにくいという課題があります。
これまでの方法としてS3 Selectを使用することがありましたがサービスの終了がアナウンスされ、また、Athenaを利用する場合はやや面倒くささを感じていました。
このため、ここではCloudShell上でDuckDBを利用して直接S3からデータを取り込むことで手軽に分析してみようと思います。

手順

  1. CloudShellを起動します
    cloudshells3のポリシーを持ったiamでawsマネジメントコーンソールにログインし、CloudShellを立ち上げます

  2. DuckDBをインストールします
    DuckDB Installation Guide
    バージョン部分は必要に応じて変更してください

    wget https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip
    unzip duckdb_cli-linux-amd64.zip
    
  3. duckdbを起動し、ログを読み込みます
    duckdbを起動

    ./duckdb
    

    duckdb上で以下のsqlを流してテーブルを作成
    s3のファイル名部分は対象となるファイルをいい感じに指定してください。複数も可能で、またglobでの表現も可能です。

    CREATE SECRET s3_secret (
        TYPE S3,
        PROVIDER CREDENTIAL_CHAIN
    ); 
    
    CREATE TABLE logs AS
    FROM read_csv(['s3://<バケット名>/<cloudfrontのID>.YYYY-MM-*.gz'],
        header = false,
        skip = 2,
        columns = {
        'date': 'DATE',
        'time': 'TIME', 
        'x-edge-location': 'VARCHAR',
        'sc-bytes': 'BIGINT',
        'c-ip': 'VARCHAR',
        'cs-method': 'VARCHAR',
        'cs(Host)': 'VARCHAR',
        'cs-uri-stem': 'VARCHAR',
        'sc-status': 'BIGINT',
        'cs(Referer)': 'VARCHAR',
        'cs(User-Agent)': 'VARCHAR',
        'cs-uri-query': 'VARCHAR',
        'cs(Cookie)': 'VARCHAR',
        'x-edge-result-type': 'VARCHAR',
        'x-edge-request-id': 'VARCHAR',
        'x-host-header': 'VARCHAR',
        'cs-protocol': 'VARCHAR',
        'cs-bytes': 'BIGINT',
        'time-taken': 'DOUBLE',
        'x-forwarded-for': 'VARCHAR',
        'ssl-protocol': 'VARCHAR',
        'ssl-cipher': 'VARCHAR',
        'x-edge-response-result-type': 'VARCHAR',
        'cs-protocol-version': 'VARCHAR',
        'fle-status': 'VARCHAR',
        'fle-encrypted-fields': 'VARCHAR',
        'c-port': 'BIGINT',
        'time-to-first-byte': 'DOUBLE',
        'x-edge-detailed-result-type': 'VARCHAR',
        'sc-content-type': 'VARCHAR',
        'sc-content-len': 'VARCHAR',
        'sc-range-start': 'VARCHAR',
        'sc-range-end': 'VARCHAR'
    });
    

    しばらく(数分?)時間かかります

    ここまでで読み込みが完了し、以後はサクサクとlogに対してsqlで分析することができます

    select * from logs;
    
  4. テーブルを出力
    このままだとduckdbを終了すると読み込んだテーブルが消えるので、データ出力しておきます

    COPY (SELECT * from logs) TO 'logs.parquet' (FORMAT parquet, COMPRESSION zstd);
    

    次回起動したときは以下のように読み込みます

    CREATE TABLE logs AS FROM read_parquet('logs.parquet');
    

メリットと注意事項

このやり方のメリットとしては、特に手元に環境を用意せず即座に分析を行えるところにあると思います。また、s3と同じリージョンでCloudShellを実行すれば、料金もかからないような気がします(※未検証)

ただ、CloudShellはインスタンスのメモリやストレージのサイズが大きくなく、CloudFrontのアクセスが多い場合にログのサイズが大きくなり、メモリやストレージが不足して満足に分析できなくなる可能性があります。その場合は、読み込むログファイルを減らしたり、手元のマシンでDuckDBを動かしたり(その場合はs3のダウンロード料金はかかる)、いっそAthenaで分析をするなどしたほうがいいかもしれません。

参考

https://qiita.com/tsukamoto/items/4f798228b35c55753346#s3-select
https://road288.hatenablog.com/entry/2024/11/06/113954
https://zenn.dev/shiguredo/articles/duckdb-jsonlines-log

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?