背景
CloudFrontのログはS3に保存されますが、そのままでは分析しにくいという課題があります。
これまでの方法としてS3 Selectを使用することがありましたがサービスの終了がアナウンスされ、また、Athenaを利用する場合はやや面倒くささを感じていました。
このため、ここではCloudShell上でDuckDBを利用して直接S3からデータを取り込むことで手軽に分析してみようと思います。
手順
-
CloudShellを起動します
cloudshell
とs3
のポリシーを持ったiamでawsマネジメントコーンソールにログインし、CloudShellを立ち上げます -
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
-
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;
-
テーブルを出力
このままだと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