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