Kết hợp ALB Access Logs + Athena để Phân Tích & Giám Sát Hiệu Suất API Chuyên mục Devops 2025-11-04 1 Lượt xem 1 Lượt thích 0 Bình luận
Trong môi trường production, việc theo dõi hiệu suất API và tình trạng hệ thống là vô cùng quan trọng. AWS cung cấp sẵn Application Load Balancer (ALB) Access Logs, nơi ghi lại toàn bộ request/response qua ALB, và Athena, công cụ truy vấn trực tiếp dữ liệu log trong S3 bằng SQL mà không cần hạ tầng phức tạp.
Bài viết này hướng dẫn chi tiết cách kết hợp ALB Access Logs với Athena để tạo hệ thống giám sát, thống kê và phân tích lỗi API nhanh chóng, tiết kiệm chi phí và dễ mở rộng.
🧰 1. Chuẩn bị môi trường
Yêu cầu:
- 
Đã có ALB đang hoạt động.
 - 
AWS CLI được cấu hình sẵn quyền truy cập.
 - 
Một S3 bucket dùng để lưu access logs.
 
⚙️ 2. Bật ALB Access Logs
Trước tiên, bạn cần kích hoạt logging cho ALB của mình để ghi log vào S3.
# Thay thế các giá trị tương ứng
ALB_ARN="arn:aws:elasticloadbalancing:REGION:ACCOUNT:loadbalancer/app/YOUR-ALB-NAME/ID"
BUCKET_NAME="your-bucket-name"
LOG_PREFIX="alb-access-logs"
aws elbv2 modify-load-balancer-attributes \
  --load-balancer-arn $ALB_ARN \
  --attributes Key=access_logs.s3.enabled,Value=true \
               Key=access_logs.s3.bucket,Value=$BUCKET_NAME \
               Key=access_logs.s3.prefix,Value=$LOG_PREFIX \
  --region REGION
💡 Lưu ý: ALB sẽ ghi log chậm vài phút, vì vậy có thể mất 5–10 phút để log đầu tiên xuất hiện trong S3.
🧱 3. Tạo Database trong Athena
Vào Athena console hoặc dùng CLI, tạo database lưu dữ liệu log:
CREATE DATABASE IF NOT EXISTS alb_access_logs;
🧩 4. Tạo bảng Athena cho ALB Logs
Athena đọc dữ liệu trực tiếp từ S3 thông qua bảng external. Dưới đây là cấu trúc bảng dành cho ALB Access Logs với Partition Projection (tự động nhận biết phân vùng theo ngày, không cần MSCK REPAIR TABLE thủ công). 
CREATE EXTERNAL TABLE IF NOT EXISTS alb_access_logs.access_logs (
    type string,
    time string,
    elb string,
    client_ip string,
    client_port int,
    target_ip string,
    target_port int,
    request_processing_time double,
    target_processing_time double,
    response_processing_time double,
    elb_status_code int,
    target_status_code string,
    received_bytes bigint,
    sent_bytes bigint,
    request_verb string,
    request_url string,
    request_proto string,
    user_agent string,
    ssl_cipher string,
    ssl_protocol string,
    target_group_arn string,
    trace_id string,
    domain_name string,
    chosen_cert_arn string,
    matched_rule_priority string,
    request_creation_time string,
    actions_executed string,
    redirect_url string,
    lambda_error_reason string,
    target_port_list string,
    target_status_code_list string,
    classification string,
    classification_reason string,
    conn_trace_id string
)
PARTITIONED BY (day STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1',
  'input.regex' = '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) "([^ ]*) (.*) (- |[^ ]*)" "([^"]*)" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) "([^"]*)" "([^"]*)" "([^"]*)" ([-.0-9]*) ([^ ]*) "([^"]*)" "([^"]*)" "([^ ]*)" "([^\\s]+?)" "([^\\s]+)" "([^ ]*)" "([^ ]*)" ?([^ ]*)? ?( .*)?'
)
LOCATION 's3://YOUR-BUCKET/alb-access-logs/AWSLogs/ACCOUNT-ID/elasticloadbalancing/REGION/'
TBLPROPERTIES (
  "projection.enabled" = "true",
  "projection.day.type" = "date",
  "projection.day.range" = "2025/01/01,NOW",
  "projection.day.format" = "yyyy/MM/dd",
  "projection.day.interval" = "1",
  "projection.day.interval.unit" = "DAYS",
  "storage.location.template" = "s3://YOUR-BUCKET/alb-access-logs/AWSLogs/ACCOUNT-ID/elasticloadbalancing/REGION/${day}"
);
Cần thay thế:
| Placeholder | Mô tả | 
|---|---|
YOUR-BUCKET | 
Tên S3 bucket chứa log | 
ACCOUNT-ID | 
AWS Account ID | 
REGION | 
Vùng của ALB, ví dụ ap-northeast-1 | 
📊 5. Một số truy vấn hữu ích trong Athena
Dưới đây là các truy vấn SQL phổ biến bạn có thể chạy ngay trong Athena console.
🔍 1. Tìm API có response time cao
Gợi ý: Dùng để phát hiện các API bị chậm bất thường, thường do backend xử lý lâu.
⚠️ 2. Tìm lỗi 4xx / 5xx
Giúp xác định endpoint nào đang trả lỗi, kèm thời điểm cụ thể.
🔎 3. Lọc theo pattern URL cụ thể
📅 4. Thống kê theo ngày
Tạo nhanh báo cáo tổng quan: tổng số request, thời gian phản hồi trung bình, và số lượng lỗi mỗi ngày.
🚨 6. Troubleshooting
Nếu không thấy dữ liệu trong Athena:
- 
Kiểm tra lại Access Log đã được bật trên ALB chưa.
 - 
Đảm bảo S3 bucket có đúng quyền truy cập.
 - 
Chờ ít nhất 10–15 phút sau khi bật log.
 - 
Kiểm tra đường dẫn trong
LOCATIONcó khớp với cấu trúc S3 thật không. 
💡 7. Lợi ích của việc kết hợp ALB Logs + Athena
| Lợi ích | Mô tả | 
|---|---|
| Phân tích tức thì | Truy vấn log bằng SQL, không cần ETL hay database riêng. | 
| Chi phí thấp | Trả tiền theo lượng dữ liệu quét, không cần server. | 
| Dễ tích hợp | Có thể kết nối Athena với QuickSight hoặc Grafana để trực quan hóa dữ liệu. | 
| Không cần bảo trì | Không phải tạo hay xóa partition thủ công nhờ Partition Projection. | 
🎯 Kết luận
Với vài bước cấu hình đơn giản, bạn có thể biến ALB Access Logs + Athena thành một công cụ mạnh mẽ để:
- 
Phân tích hiệu suất backend API
 - 
Theo dõi tỉ lệ lỗi theo thời gian
 - 
Điều tra nguyên nhân request chậm hoặc lỗi 5xx
 - 
Xây dựng dashboard giám sát realtime với QuickSight hoặc Grafana
 
Đây là một giải pháp giám sát production nhẹ, rẻ, và cực kỳ hiệu quả — đặc biệt phù hợp với các hệ thống dùng ECS hoặc microservices chạy sau ALB.
                        
                                        
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
                                                    
Bình luận (0)