Chaos Testing an Application on AWS
Bài tóm tắt Goldman Sachs 2022 3. Quy mô lớn Độ khó: Trung bình
Goldman Sachs · 2022 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc
Bối cảnh
- Ứng dụng có đủ unit, integration, performance test nhưng sự cố production vẫn đến từ lỗi vận hành: DB hỏng, DNS hỏng, node chết, traffic bất thường, với MTTD/MTTR cao vượt SLO. Sự cố cho thấy lỗ hổng ở test, ở thời điểm và nội dung alert, và engineer không quen hành vi hệ khi có lỗi.
- Resilience test làm tay thì tốn công, làm một lần rồi thôi; runbook và observability nhanh lỗi thời vì ứng dụng đổi nhanh hơn tần suất test.
Thay đổi chính
- Hệ cần kiểm: 7 microservice trên 5 tài khoản AWS, nhiều VPC; Fargate, Aurora Postgres, Elasticsearch, Lambda, NLB, dependency ngoài qua VPC endpoint; SLO 99,99% khả dụng, p95 50 ms.
- Chaos trong CI/CD: ChaosToolkit (thêm plugin tự viết) chạy từ pipeline GitLab; môi trường sandbox (một VPC) dựng và huỷ bằng IaC; token truy cập ngắn hạn nên quyền gây lỗi chỉ tồn tại trong lúc test; test fail thì pipeline fail; kết quả lưu vào kho làm audit trail của mọi lần tiêm lỗi. Có thể dùng làm cổng chặn khi một deploy làm giảm độ bền.
- Ba nhóm lỗi theo bán kính ảnh hưởng: hạ tầng (tắt ECS task, failover hoặc tắt cụm DB, tới mất AZ/region); mạng (phá kết nối VPC endpoint tới dependency); hình dạng traffic bằng k6 (tăng user, đỉnh nhọn, retry storm, payload to nhỏ).
- Game day: chọn một kịch bản từ bộ test mà không báo trước cho team; team phải chẩn đoán và đưa hệ về trong SLO; cập nhật runbook theo.
Vì sao (kết quả)
- Kiến trúc: giả lập dependency ngoài hỏng lộ ra một đường cho traffic độc hại lọt vào im lặng, dẫn tới xem lại cách tích hợp; lỗi DB cho thấy cần lớp cache.
- Observability và capacity: health check 30 giây làm phát hiện node chết chậm, tỉ lệ lỗi 0,14%; rút ngắn còn 0,07%. Một instance mất kết nối làm lỗi tăng 10% vì load balancer kiểm sức khoẻ không đủ chặt. Test tải bằng k6 cho thấy cấu hình scale-up kém; sửa xong thời gian scale-up cải thiện 50% (theo bài).
- Runbook: đường leo thang và liên hệ của dependency ngoài chưa được ghi; runbook lỗi thời làm tăng MTTR.
- Còn tìm ra phụ thuộc lúc khởi động không chủ ý và điểm hỏng đơn.
Bài học cho SWE
- Đưa resilience test vào pipeline biến nó từ sự kiện hiếm thành kiểm tra liên tục; quyền gây lỗi nên ngắn hạn và có audit.
- Khoảng health check là một tham số của MTTD: nó quyết định bao lâu traffic còn bị gửi tới node đã chết.
- Game day không báo trước kiểm cả con người và runbook, thứ CI không kiểm được.
Liên quan
Được nhắc tới trong
Công ty (1)