Blog
Thoughts on engineering, design, and building great products.
Bảo Mật: IAM Least-Privilege, Throttling và WAF
Siết bảo mật cho sản phẩm. Thu quyền IAM của từng hàm về đúng hành động nó cần thay vì cấp cả bộ đọc-ghi, đặt throttle ở API Gateway để chống lạm dụng, bàn về nơi cất bí mật, và cách gắn WAF cho một HTTP API. Kiểm rằng least-privilege không làm hỏng chức năng, và quan sát hệ thống tự gạt tải khi bị dội.
Cold Start: Đo Thật Rồi Tối Ưu Cái Tối Ưu Được
Quay lại cold start với số đo thật. Ép một cold start trên handler resolve để thấy Init Duration và cái giá của lần gọi đầu, rồi soi các cách giảm: tăng bộ nhớ (cũng là tăng CPU), cắt kích thước gói, SnapStart, và provisioned concurrency — mỗi cách có chỗ dùng riêng, và trên tài khoản test có cách không áp dụng được.
CloudWatch: Alarm, Dashboard và SLO Cho API
Có log, trace và metric rồi thì bước tiếp là tự động biết khi nào hệ thống có vấn đề. Định nghĩa SLO cho API, dựng alarm trên CloudWatch để cảnh báo khi lỗi hay throttle vượt ngưỡng, gom metric vào một dashboard, và dùng Logs Insights để tính chỉ số từ log có cấu trúc. Kích một alarm thật sang trạng thái ALARM bằng cách tạo throttle.
Quan Sát Hệ Thống: Lambda Powertools và X-Ray Tracing
Bắt đầu phần vận hành như production bằng việc nhìn được vào bên trong. Gắn Lambda Powertools để có log JSON có cấu trúc và đẩy metric, bật X-Ray để theo dấu một request đi qua những dịch vụ nào. Đọc một trace thật cho thấy resolve gọi DynamoDB và EventBridge thành các subsegment, và một dòng log mang sẵn trace id để nối log với trace.
Step Functions: Điều Phối Quy Trình Nhiều Bước và Mẫu Saga
Khi một quy trình có nhiều bước, rẽ nhánh và xử lý lỗi, nhồi hết vào một hàm Lambda sẽ rối và khó nhìn. Step Functions tách logic điều phối ra thành một state machine khai báo. Dựng một workflow kiểm duyệt link (quét an toàn rồi kích hoạt hoặc từ chối), với Retry, Catch, và gọi thẳng DynamoDB không qua Lambda. Bàn tới Standard so với Express, và mẫu saga để hoàn tác khi một bước giữa chừng thất bại.
WebSocket API: Đẩy Số Click Xuống Dashboard Realtime
Làm phần realtime của dashboard. Dựng WebSocket API của API Gateway với route $connect và $disconnect, lưu mỗi kết nối vào DynamoDB gắn với link nó đang theo dõi, rồi cho aggregator đẩy số click mới xuống đúng các kết nối đang mở mỗi khi đếm xong. Mở một kết nối thật, click link, và thấy số nhảy về trình duyệt không cần tải lại.
Đếm Click An Toàn: Idempotency, DLQ và Partial Batch Failure
Biến consumer ghi log ở bài trước thành một aggregator thật. Chèn SQS giữa EventBridge và Lambda để có batch, retry và dead-letter queue, đếm click vào DynamoDB bằng transaction để vừa cộng bộ đếm vừa chống đếm trùng trong một thao tác nguyên tử, và báo lỗi theo từng message để chỉ thử lại cái hỏng. Test thật: gửi trùng sự kiện đếm một lần, sự kiện lỗi rơi vào DLQ.