Obiz Solutions

AWS Athena là gì?

Athena là dịch vụ AWS cho phép chạy SQL trực tiếp trên file nằm sẵn trong S3 (CSV, JSON, Parquet, log dạng text…) mà không cần dựng database, không cần ETL trước dữ liệu vào đâu cả. Đây là dạng serverless “schema-on-read”: bạn khai báo cấu trúc bảng (DDL) trỏ vào 1 thư mục S3, Athena đọc file theo schema đó ngay lúc query, không lưu trữ dữ liệu riêng.

Cách hoạt động

  1. Glue Data Catalog lưu định nghĩa bảng (tên cột, kiểu dữ liệu, vị trí S3) — giống metadata của 1 database nhưng không có engine lưu trữ đi kèm
  2. Khi chạy query, Athena đọc trực tiếp file trong S3 tại thời điểm đó, xử lý bằng engine Presto/Trino bên dưới
  3. Kết quả trả về, không có gì được “insert” hay lưu lại — lần sau query lại đọc file mới nhất trong S3

Tạo bảng cho CloudFront logs

Ví dụ áp dụng cho log CloudFront đã cấu hình ở bài Setup và deploy (33 field, plain-text, tab-delimited):

CREATE EXTERNAL TABLE cloudfront_logs (
  date STRING, time STRING, x_edge_location STRING, sc_bytes BIGINT,
  c_ip STRING, cs_method STRING, cs_host STRING, cs_uri_stem STRING,
  sc_status STRING, cs_referer STRING, cs_user_agent STRING,
  cs_uri_query STRING, cs_cookie STRING, x_edge_result_type STRING,
  x_edge_request_id STRING, x_host_header STRING, cs_protocol STRING,
  cs_bytes BIGINT, time_taken FLOAT, x_forwarded_for STRING,
  ssl_protocol STRING, ssl_cipher STRING,
  x_edge_response_result_type STRING, cs_protocol_version STRING,
  fle_status STRING, fle_encrypted_fields STRING, c_port INT,
  time_to_first_byte FLOAT, x_edge_detailed_result_type STRING,
  sc_content_type STRING, sc_content_len BIGINT, sc_range_start STRING,
  sc_range_end STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LOCATION 's3://YOUR_BUCKET-logs/cf-logs/'
TBLPROPERTIES ('skip.header.line.count'='2');

LOCATION trỏ vào cả thư mục — Athena tự đọc mọi file log CloudFront ghi vào đó, kể cả file mới thêm sau này, không cần tạo lại bảng.

Query ví dụ

-- Top 20 trang được xem nhiều nhất
SELECT cs_uri_stem, COUNT(*) AS views
FROM cloudfront_logs
WHERE cs_method = 'GET' AND sc_status = '200'
GROUP BY cs_uri_stem
ORDER BY views DESC
LIMIT 20;

-- Traffic theo ngày
SELECT date, COUNT(*) AS requests
FROM cloudfront_logs
GROUP BY date
ORDER BY date;

Chi phí

Athena tính phí theo dung lượng dữ liệu scan mỗi query ($5/TB), không tính phí theo giờ như 1 database server. Với log của 1 blog cá nhân (thường chỉ vài MB tới vài chục MB), mỗi query tốn chưa tới 1 cent. Không query thì không tốn gì — khác hẳn phải trả tiền chạy 24/7 cho 1 database/server riêng.

So với GoAccess

GoAccess và Athena giải quyết cùng bài toán (đọc CloudFront log) theo 2 cách khác nhau:

  • GoAccess: tải file log về máy, chạy 1 lệnh, ra dashboard HTML ngay — nhanh, trực quan, nhưng phải tự tải log mỗi lần muốn cập nhật
  • Athena: query SQL trực tiếp trên S3, không cần tải gì về, linh hoạt viết câu hỏi tùy ý (traffic theo giờ, lọc theo status code…) — nhưng cần biết SQL, và không có sẵn dashboard trực quan (phải tự dựng hoặc dùng thêm QuickSight)

Khi nào nên dùng Athena

  • Cần trả lời câu hỏi tùy biến mà dashboard có sẵn không hỗ trợ (vd. lọc theo user-agent cụ thể, tính theo khung giờ)
  • Không muốn tải log về máy, muốn query trực tiếp trên S3
  • Đã quen SQL — không cần học thêm công cụ mới

Tài liệu tham khảo

Tài liệu chính thức: docs.aws.amazon.com/athena