オブジェクトストレージ と DuckDB で実現する低コストログ解析
自社では自社パッケージ製品のクラウド版を提供しています。自社パッケージは大量の JSON Lines 形式のログを出力します。
この大量のログの利用者向けと管理者向けの解析をどうしたものかとずっと悩んでいたのですが、オブジェクトストレージと DuckDB を利用する事で低コストで実現できました。
オブジェクトストレージ
まず、とにかくオブジェクトストレージは安価な上に何も考えずスケールする仕組みなのがログ置き場としてとても良いです。自社では Akamai Connected Cloud のオブジェクトストレージを利用してますが、250 GB で月 5 ドル、転送量 1 TB 付きという安さです。
自作のログアップローダーを利用しており、 Zstd 圧縮してからオブジェクトストレージへアップロードしています。
自社サービス規模であれば圧縮済みのログのサイズが 10 TB 行ったとしても、月 200 ドルです。
DuckDB
解析には DuckDB を採用しました。数百 GB 以下のログの解析であれば、圧倒的な速度で処理できます。
オブジェクトストレージからログを直接読み取って、処理をし、Parquet ファイルを出力するといった事が簡単にできます。
特にオブジェクトストレージからサクッと圧縮されたログを複数取得して、テーブルを作り、後は好きなように解析できるのは本当に良いです。他のログを別テーブルにして JOIN して解析も簡単です。
CREATE TABLE auth_log AS SELECT * FROM 's3://log/2025/03/*/auth.jsonl.zst
利用者向け
利用者向けのログは go-duckdb を利用して DuckDB を利用者からのリクエスト毎にオンメモリで処理しています。動かしているのは 1 コア 1 GB の月 5 ドルのマシンです。
go-duckdb で利用者が必要とするログをオブジェクトストレージから取得して、Parquet 化して Presigned URL として提供しています。
利用者は Parquet ファイルを取得後、 DuckDB-Wasm へ OPFS 経由で Parquet ファイルを読み込んで解析しています。
DuckDB-Wasm がどんなものかが気になる方はデモを用意してるのでもしよければどうぞ。
ここまでにかかってる費用は最小 10 ドルです。
管理者向け
管理者向けも利用者向けと同様の仕組みで実現しています。DuckDB を CLI で利用して、オブジェクトストレーから読み込んで、手元のマシンで処理することもあります。
さらに Grafana DuckDB Data Source Plugin を利用してオブジェクトストレージにため込んだログを Grafana で可視化する仕組みも利用を検討しています。
管理者向けも利用者向けと同じ仕組みに乗っかっているので最小 10 ドルのままです。
オブジェクトストレージのスケール
ログ置き場をオブジェクトストレージにすることでいくらでもログを置いておけるようになります。Akamai のオブジェクトストレージは 1 バケット 1 PB (将来的に 5 PB) なので、容量が気になることは当面なさそうです。
また DuckDB もよほどの長期間のログを処理しないかぎりは、CPU リソースを使う事はありません。また、とにかくメモリにのせてしまえばいいので、メモリが大きいインスタンスを使えば十分です。
Akamai Connected Cloud では 90 GB のメモリで月 240 ドルで利用できるハイメモリインスタンスがあるので、それを利用すれば自社の規模であれば困ることはなさそうです。
まとめ
オブジェクトストレージと DuckDB の組み合わせ、本当にお勧めです。