AWS WAF의 로그를 DuckDB로 쿼리하는 방법에 대해 알아보자!
안녕하세요! 클래스메소드 금상원 입니다.
이번 블로그에서는 AWS WAF의 로그를 DuckDB로 쿼리하는 방법에 대해알아보도록 하겠습니다.
DuckDB란
DuckDB는 내 컴퓨터 안에서 바로 실행되는 분석용 데이터베이스다. MySQL이나 PostgreSQL처럼 서버를 따로 설치하거나 켜둘 필요가 없습니다. 터미널에서 duckdb라고 입력하면 그 즉시 SQL을 실행할 수 있습니다.
비유하자면 이렇습니다. Excel이 스프레드시트를 열어 수식을 계산하듯, DuckDB는 CSV, JSON, Parquet 같은 파일을 열어 SQL로 분석합니다. 차이가 있다면 수억 건 데이터도 빠르게 처리한다는 점입니다.
DuckDB가 빠른 이유는 컬럼나 방식(columnar)으로 데이터를 처리하기 때문입니다. 일반 데이터베이스가 행(row) 단위로 읽는 데 반해, DuckDB는 분석에 필요한 열(column)만 골라 읽습니다. 예를 들어 action 컬럼의 BLOCK 건수를 세려면, 나머지 컬럼은 아예 읽지 않습니다.
AWS WAF로그에 DuckDB를 사용하는 이유
AWS WAF는 누가 내 서비스에 접근하는지, 어떤 요청이 차단됐는지를 S3에 JSON 파일로 기록합니다. 하루 트래픽이 많은 서비스라면 이 파일이 수십 GB에 달하는 경우도 있습니다.
문제는 이 방대한 로그를 열어보기가 쉽지 않다는 것입니다. 파일을 직접 열면 JSON이 줄줄이 나오고, CloudWatch Logs Insights는 제한이 있으며, Athena는 별도 설정과 비용이 필요합니다.
DuckDB는 이 문제를 아주 단순하게 해결합니다. S3에 있는 WAF 로그 파일을 그대로 가리켜 SQL을 실행할 수 있기 때문입니다. 다운로드도, 변환도, 별도 설정도 필요 없습니다.
| 장점 | 설명 |
|---|---|
| ⚡ 빠른 시작 | 설치 후 5분 안에 첫 쿼리 실행 가능. 복잡한 사전 설정 불필요. |
| 💰 비용 없음 | DuckDB 자체는 무료 오픈소스. 쿼리를 아무리 반복해도 추가 비용 없음. |
| 🔒 데이터가 로컬 밖으로 나가지 않음 | 분석이 내 컴퓨터 메모리에서 실행됩니다. 민감한 로그를 외부 서비스에 올릴 필요 없음. |
| 🔁 자유로운 반복 탐색 | 쿼리를 수정하며 반복 실행해도 비용 걱정 없이 탐색 가능. 인시던트 대응에 적합. |
📌 WAF 로그 어디에 있나요?
AWS WAF 콘솔 → Web ACL → Logging 탭에서 로깅을 활성화하면, Kinesis Firehose를 통해 S3에 자동으로 저장됩니다. 버킷 이름은 반드시aws-waf-logs-로 시작해야 합니다 (AWS 규칙).
경로 형태:s3://aws-waf-logs-버킷명/AWSLogs/계정ID/WAFLogs/리전/WebACL명/연도/월/일/
AWS Athena와 차이점
AWS Athena도 S3 위에서 SQL을 실행하는 서비스입니다. 둘 다 같은 WAF 로그를 대상으로 쿼리할 수 있지만, 사용 목적과 특성이 다릅니다.
| 항목 | DuckDB | Amazon Athena |
|---|---|---|
| 실행 위치 | 내 컴퓨터 (로컬) | AWS 클라우드 |
| 설정 난이도 | ✅ 바이너리 설치 후 바로 사용 | ⚠️ Glue 카탈로그, 파티션, 워크그룹 설정 필요 |
| 비용 | ✅ 무료 (S3 읽기 요청 비용 제외) | ⚠️ 스캔 데이터 1TB당 약 $5 |
| 반복 쿼리 | ✅ 비용 없이 자유롭게 반복 | ⚠️ 반복할수록 비용 누적 |
| 팀 공유 | ⚠️ 개인 로컬 환경 (공유 불편) | ✅ 저장된 쿼리, 팀 공유 용이 |
| 대규모 데이터 | ⚠️ 로컬 메모리 한계 (수백 GB 이상 시 주의) | ✅ 수백 TB도 처리 가능 |
| 적합한 상황 | 긴급 조사, 임시 분석, 개인 작업 | 정기 리포트, 팀 협업, 대규모 자동화 |
💡 결론
"지금 당장 뭔가 이상한데, 빠르게 확인하고 싶다" → DuckDB
"매주 자동으로 리포트를 뽑아 팀과 공유해야 한다" → Athena
DuckDB로 AWS WAF로그 쿼리해보기
이번 블로그에서는 MacOS를 기준으로 설명해 드리겠습니다.
DuckDB 설치
DuckDB 설치는 아래의 링크에서 Platform을 자신의 OS에 맞게 선택한 후 나타나는 방법대로 설치를 진행 합니다.

위의 화면에서 「Platform」 을 클릭합니다.

표시되는 OS중에서 자신의 환경에 맞는 것을 클릭하고 나타나는 방법에 따라 설치를 진행합니다.
Amazon S3에서 AWS WAF로그 다운로드하기

AWS검색창에서 「Amazon S3」 를 검색합니다.

왼쪽 메뉴에서 「범용 버킷을」 클릭하고 AWS WAF로그가 있는 버킷을 클릭합니다.

버킷에서 쿼리할 로그를 선택하고 다운로드 합니다.
다운로드한 로그는 쿼리하기 편하게 별도의 폴더에 저장하여 관리해주면 좋습니다.
AWS WAF 로그 쿼리하기
STEP 1 — DuckDB 실행하기
이 글에서 소개하는 모든 명령어는 AWS WAF 로그가 저장된 폴더에서 실행합니다.
먼저 터미널에서 WAF 로그가 저장된 디렉토리로 이동한 후, duckdb를 입력해 실행합니다.
keumsangwon ~ % DuckDB
DuckDB v1.5.0 (Variegata)
Enter ".help" for usage hints.
memory D
memory D 프롬프트가 표시되면 쿼리를 실행할 준비가 완료된 것입니다.
STEP 2 — 테이블 만들기
현재 폴더 안의 모든 WAF 로그 파일(.log.gz)을 읽어 test 테이블을 생성합니다.
CREATE TABLE test AS SELECT * FROM read_json_auto('*.log.gz')
💡
read_json_auto('*.log.gz')는 폴더 안의 모든 AWS WAF 로그 파일을 자동으로 읽어옵니다.
테이블로 만들어 두면 이후 쿼리가 훨씬 빠르게 실행됩니다.
STEP 3 — 기본 쿼리
테이블이 준비됐다면 아래 쿼리들로 데이터를 확인할 수 있습니다.
# test 테이블의 모든 데이터를 읽어오기
SELECT * FROM test;
# test 테이블에서 BLOCK된 데이터만 읽어오기
SELECT * FROM test WHERE action = 'BLOCK';
# 쿼리한 결과를 CSV 파일로 내보기
COPY (SELECT * FROM test) TO 'test.csv' (HEADER, DELIMITER ',');
STEP 4 — 실전 쿼리: BLOCK 로그를 보기 좋게 정리하기
위의 기본 쿼리만으로도 충분히 확인할 수 있지만, 실제로 사용해보면 아래와 같은 불편함이 생깁니다.
timestamp읽기 어렵습니다- 컬럼이 너무 많아 필요한 정보를 찾기 힘듭니다
- 시간순으로 정렬이 안 돼 있어 흐름을 파악하기 어렵습니다
아래 쿼리는 이 세 가지를 한 번에 해결합니다.
COPY (
SELECT
strftime(
(to_timestamp(timestamp/1000) AT TIME ZONE 'Asia/Seoul')::TIMESTAMPTZ,
'%Y-%m-%d %H:%M:%S'
) AS datetime,
action,
terminatingRuleId,
httpRequest['httpMethod'] AS httpMethod,
httpRequest['clientIp'] AS clientIp,
httpRequest['uri'] AS uri,
labels
FROM test
WHERE action = 'BLOCK'
ORDER BY datetime ASC
) TO 'test.csv' (HEADER, DELIMITER ',');
이 쿼리 한 줄로 아래 네 가지를 동시에 처리합니다.
| 처리 항목 | 설명 |
|---|---|
| ⏰ 타임존 변환 | timestamp를 서울 시간(KST)으로 변환해 읽기 쉬운 형식으로 표시합니다 |
| 🔍 필요한 컬럼만 선택 | clientIp, uri, terminatingRuleId 등 분석에 필요한 값만 추출합니다 |
| 🔃 시간순 정렬 | ORDER BY datetime ASC 로 발생 순서대로 정렬합니다 |
| 💾 CSV 내보내기 | COPY ... TO 'test.csv' 로 결과를 바로 파일로 저장합니다 |
✅ 실행이 완료되면 같은 폴더에
test.csv파일이 생성됩니다. Excel이나 Google Sheets에서 바로 열어볼 수 있습니다.
마무리
이번 블로그에서는 DuckDB를 활용하여 AWS WAF 로그를 간편하게 쿼리하는 방법을 살펴보았습니다.
AWS Athena 환경을 구성하기 어려운 상황이거나, 빠르고 간단하게 로그를 분석하고 싶으신 분들께 조금이나마 도움이 되셨으면 합니다.
참고 자료
문의 사항은 클래스메소드 코리아로!
클래스메소드 코리아에서는 다양한 세미나 및 이벤트를 진행하고 있습니다.
진행중인 이벤트는 아래 페이지를 참고해주세요.
AWS에 대한 상담 및 클래스 메소드 멤버스에 관한 문의사항은 아래 메일로 연락주시면 감사드립니다!
Info@classmethod.kr








