- Một trường hợp phát sinh chi phí truyền dữ liệu S3 khoảng $900 chỉ trong một ngày, vượt $1.000 cộng dồn theo tháng do lỗi cấu hình AWS VPC networking và NAT Gateway
- Nhiều người cho rằng truyền dữ liệu từ EC2 sang S3 là miễn phí, nhưng nếu đi qua NAT Gateway trong VPC thì sẽ phát sinh phí xử lý dữ liệu có tính phí
- Nguyên nhân là thiếu VPC Gateway Endpoint cho S3, tức không có cấu hình kết nối trực tiếp tới S3 mà không đi qua NAT Gateway
- Gateway Endpoint miễn phí và không phát sinh phí truyền dữ liệu, có thể cấu hình đơn giản bằng Terraform
- Đây là ví dụ cho thấy tầm quan trọng của việc giám sát chi phí và kiểm tra cấu hình VPC Endpoint khi vận hành hạ tầng AWS
Bối cảnh vấn đề
- Geocodio sử dụng AWS để mirror các tệp dữ liệu địa lý nội bộ dung lượng lớn lên S3
- Dữ liệu gồm các điểm địa chỉ, dữ liệu ranh giới, thông tin điều tra dân số..., với quy mô từ vài GB đến hàng trăm GB
- Cần đồng bộ định kỳ từ nền tảng ETL được host trên Hetzner sang hạ tầng xử lý trên AWS
- Chi phí truyền dữ liệu của AWS cao là một phàn nàn phổ biến trong toàn ngành; Cloudflare và Corey Quinn cũng từng chỉ ra vấn đề này
- Tác giả đã xem xét cấu trúc chi phí trước khi bắt đầu dự án và xác nhận rằng
- truyền EC2–S3 trong cùng region là miễn phí
- upload vào S3 (lưu lượng đi vào) là miễn phí
từ đó ước tính chi phí
Chi phí phát sinh ngoài dự kiến
- Sau khi triển khai quy trình đồng bộ S3, hệ thống AWS Cost Anomaly Detection gửi cảnh báo bất thường
- Chỉ trong một ngày, lưu lượng qua NAT Gateway đạt 20,167.32GB, tạo ra chi phí $907.53
- Chi phí cộng dồn theo tháng đã vượt $1.000
- Trong bối cảnh tin rằng truyền EC2–S3 là miễn phí, tác giả đã điều tra vì sao lại bị tính phí NAT Gateway
Phân tích nguyên nhân: đi qua NAT Gateway
- Khi VPC sử dụng NAT Gateway, traffic tới S3 theo mặc định cũng được route qua NAT Gateway
- Ngay cả khi request hướng tới dịch vụ AWS trong cùng region, nếu đi qua NAT thì vẫn bị tính phí xử lý dữ liệu $0.045 mỗi GB
- Vì vậy, dù truyền EC2–S3 là miễn phí, chi phí NAT Gateway vẫn bị tính
- Cách giải quyết là tạo VPC Gateway Endpoint cho S3
- Kết nối trực tiếp từ VPC tới S3 mà không đi qua NAT Gateway hay Internet Gateway
- Hoàn toàn miễn phí, không có phí theo giờ hay phí truyền dữ liệu
Quá trình khắc phục
- Hạ tầng được quản lý bằng Terraform, nên tác giả thêm resource Gateway Endpoint và liên kết với route table
- AWS tự động cập nhật routing để gửi traffic S3 qua Endpoint thay vì NAT Gateway
- Sau đó, việc tính phí liên quan tới NAT Gateway đã dừng lại
Bài học và khuyến nghị
- Dù đã dùng AWS trong thời gian dài, tác giả vẫn phát sinh chi phí do bỏ sót cấu hình VPC Endpoint cho S3
- AWS networking rất phức tạp, và cấu trúc chi phí có thể thay đổi lớn tùy theo cách cấu hình
- Các khuyến nghị để tránh tái diễn
- Bật AWS Cost Anomaly Detection: giúp phát hiện chi phí bất thường sớm
- Sử dụng VPC Endpoint: gần như bắt buộc khi truy cập S3 hoặc DynamoDB trong VPC có dùng NAT Gateway
- Kiểm chứng giả định: đừng chỉ tin vào tiền đề “truyền EC2–S3 là miễn phí”, hãy test với khối lượng nhỏ và theo dõi chi phí
- Cloud rất phức tạp: kể cả người dùng lâu năm vẫn cần liên tục cẩn trọng
- Bài viết cũng nhắc tới trường hợp tương tự khi Recall.ai trả $1 triệu mỗi năm cho chi phí xử lý dữ liệu WebSocket
Hành động tiếp theo
- Geocodio đã kiểm tra đường truyền S3 của toàn bộ VPC và hoàn tất cấu hình Gateway Endpoint
- Khuyến nghị người dùng AWS xác nhận lại cấu hình VPC Endpoint
- Tóm lại: NAT Gateway vẫn tính phí cả với traffic tới dịch vụ AWS, và có thể tránh chi phí này bằng cách dùng VPC Endpoint
Tài liệu bổ sung
1 bình luận
Ý kiến Hacker News
Tôi thường thấy những ca hóa đơn bùng nổ chi phí như thế này xuất hiện gần như mỗi ngày một lần trên ba subreddit lớn về cloud
Các nhà cung cấp cloud lúc nào cũng chỉ đưa ra cảnh báo trễ, còn người dùng thì chỉ biết cầu nguyện và xin cứu trợ
Hơn nữa, có người còn nói rằng “về mặt kỹ thuật thì không thể cung cấp tài khoản có hard cap”, nhưng trên thực tế Azure đã có loại tài khoản như vậy
Tôi đã dùng AWS hơn 10 năm, và thấy rõ sự đứt gãy trong thiết kế giữa các dịch vụ cùng mức độ phân mảnh theo silo trong nội bộ tổ chức rất nghiêm trọng
Trong các tổ chức lớn, chẳng có lãnh đạo nào muốn xử lý những vấn đề có thể làm xấu KPI; thay vào đó họ tập trung kiếm điểm thăng chức bằng cách tung ra các dịch vụ hợp mốt như AI hay blockchain
Bạn có thể chọn các gói $0, $15, $200 mỗi tháng để tránh hóa đơn tăng vọt do số lượng request hoặc lưu lượng truyền dữ liệu tăng ngoài dự kiến
Liên kết blog chính thức của AWS
Chuỗi thảo luận HN liên quan
Việc đặt trần chi phí mà vẫn giữ được độ ổn định dịch vụ quả thật không dễ, nhưng trường hợp lần này đã chứng minh là về mặt kỹ thuật hoàn toàn khả thi
Mục đích là để tránh rủi ro danh tiếng do gián đoạn dịch vụ hoặc sự cố hạ tầng
Nhưng vấn đề có thể nằm ở chính cloud. Với các doanh nghiệp nhỏ cần cấu trúc chi phí có thể dự đoán được, cloud có thể không phải lựa chọn phù hợp
Chuyện này xảy ra quá thường xuyên đến mức tôi nghĩ S3 VPC Endpoint nên được bật mặc định khi tạo VPC
Và nếu dùng các lựa chọn thay thế như fck-nat thay cho NAT Gateway thì có thể tiết kiệm phí lưu lượng theo GB
Phải ở trạng thái từ chối truy cập mặc định và chỉ cho phép truy cập Internet một cách tường minh; nếu không thì kẻ tấn công có thể rò rỉ dữ liệu
Tôi cũng từng mắc lỗi tương tự
Tôi tải dữ liệu thử nghiệm lên thuật toán gợi ý của AWS rồi quên mất, đến vài tháng sau thì ngân hàng báo số dư không đủ
Thuật toán cứ tiếp tục chạy và bị tính hơn 1.000 đô mỗi tháng, cuối cùng tôi mất 5.000 đô
Tôi kiểm tra số dư mỗi ngày và đánh dấu tất cả email tính phí là quan trọng
Ngoài ra tôi còn có thói quen đặt hạn mức thẻ ảo cho từng dịch vụ
Tôi cũng từng mắc đúng lỗi đó và mất 60.000 đô
Tôi không hiểu vì sao S3 endpoint lại không được triển khai mặc định
Tôi thường được hỏi “vì sao hóa đơn AWS lại nổ tung”, và trong đa số trường hợp đó là tổ hợp NAT + S3 + giả định sai
Truyền EC2→S3 thì miễn phí, nhưng nếu đi qua NAT thì sẽ bị tính tiền
Vì vậy tôi thường đưa checklist sau
May mà Cost Anomaly Detection đã hoạt động kịp thời. Mất 1.000 đô cũng đau thật, nhưng vẫn còn đỡ hơn 20.000 đô
Tôi đã sốc khi biết tải dữ liệu xuống từ AWS phải trả $0.09 cho mỗi GB
Tải dữ liệu lên thì miễn phí, nhưng muốn lấy ra lại phải trả tiền sao?
Trường hợp lần này là một ca đặc biệt, trong đó lỗi cấu hình NAT khiến lưu lượng nội bộ bị tính như lưu lượng đi ra ngoài
Tôi tò mò không biết Amazon có hoàn tiền cho những lỗi kiểu này không
VPC NAT Gateway nổi tiếng tai tiếng
Trước đây khi còn làm ở Amazon tôi cũng gặp vấn đề tương tự, nhưng vì là tài khoản công ty nên không phải trả tiền
Tôi thật sự thấy tội cho những người phải tự bỏ tiền ra trả
Trường hợp này không giúp trực tiếp, nhưng hôm qua AWS đã ra mắt gói giá cố định cho CDN
Cũng có cả tier $0 bao gồm storage S3 và băng thông
Liên kết liên quan
Hy vọng sau này sẽ được mở rộng sang các dịch vụ khác
Hồi 22 tuổi, lần đầu tôi đụng vào hạ tầng và chỉ trong hai ngày đã dính hóa đơn 300 đô
AWS rất tuyệt, nhưng với người mới thì cách tính chi phí quá thiếu minh bạch