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 duckdbS3を読み込むための設定をする
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に渡すパスをできるだけ深くするなど、工夫が必要。

