duckdbでS3バケットに保存しているECSのログをクエリ

ECSのコンテナが出力するログをFireLens経由でS3バケットに送信したあと、ログを手っ取り早く調べる方法はないかと調べていたらduckdbというのがあったので試してみましたのでメモします。

docker-compose.ymlは以下の通り。

version: "3.9"

services:
  duckdb:
    image: duckdb/duckdb:latest
    container_name: duckdb-s3
    environment:
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_REGION: ${AWS_REGION:-ap-northeast-1}

以下のようにCLIを起動する

docker compose run duckdb

S3を読み込むための設定をする

INSTALL httpfs;
LOAD httpfs;
CREATE SECRET secret (
  TYPE S3,
   PROVIDER CREDENTIAL_CHAIN
 );

ビューを定義する(同一名のビューがあった場合は同じ名前で再定義される。read_json_autoに渡しているS3のパスはタスク定義のs3_key_formatに依存するのでそれに合わせる。また、gzip圧縮していない場合は、compressionの指定不要。)

CREATE OR REPLACE VIEW ecs_logs AS
  SELECT *
  FROM read_json_auto(
    's3://my-bucket-name/fluent-bit-logs/my-app-firelens-fd14318cbe65402d8c415e9d24dad149/**/*',
    format='auto',
    compression='gzip'
  );

クエリを実行する

select log from ecs_logs order by date desc limit 20;

ログの量が多い場合はクエリにかなり時間がかかるのでread_json_autoに渡すパスをできるだけ深くするなど、工夫が必要。

Copied title and URL