Một lệnh nhầm, bốn tiếng: chuyện Amazon S3 năm 2017
Ngày 28/2/2017, một lệnh gõ với một giá trị nhập sai đã gỡ nhiều máy chủ hơn dự định khỏi dịch vụ lưu trữ Amazon S3 và làm nhiều dịch vụ trên internet chậm hoặc ngừng trong khoảng bốn tiếng. Bài kể lại theo báo cáo sau sự cố của chính AWS, và rút ra các lớp bảo vệ mà công cụ có quyền xóa nên có.
Đây là câu chuyện có thật, không phải chuyện của mình. Mình kể lại theo báo cáo sau sự cố do chính AWS công bố (link ở cuối bài, mình đọc trực tiếp). Báo cáo không nêu tên người thực hiện lệnh, nên mình cũng không đặt tên và không đoán điều họ nghĩ.
Bài này khác bài GitLab 2017 ở một điểm: đây không phải câu chuyện về sao lưu hỏng, mà về một công cụ cho phép gỡ quá nhiều chỉ bằng một giá trị nhập sai. Giờ trong bài là giờ Thái Bình Dương (PST) như trong báo cáo.
Tóm tắt nhanh#
- Ngày 28/2/2017, lúc 9:37 sáng, một thành viên được ủy quyền của nhóm S3 chạy một lệnh để gỡ một số ít máy chủ khỏi một hệ thống con liên quan đến tính cước. Một giá trị nhập sai khiến nhiều máy chủ hơn dự định bị gỡ.
- Số máy chủ bị gỡ phục vụ hai hệ thống lõi của S3: chỉ mục và phân bổ. Cả hai phải khởi động lại hoàn toàn.
- S3 ở vùng US-EAST-1 chỉ hoạt động bình thường lại lúc 1:54 chiều, khoảng bốn tiếng mười bảy phút sau.
- Điểm đáng nói: lệnh làm đúng điều nó được dạy, chỉ là không có gì ngăn nó gỡ quá nhiều. Cả bảng theo dõi sức khỏe dịch vụ của AWS cũng phụ thuộc vào S3.
- AWS sửa công cụ để gỡ chậm hơn và không bao giờ gỡ xuống dưới mức tối thiểu.
Từ khó, nói dễ#
| Thuật ngữ | Nói dễ hiểu |
|---|---|
| Amazon S3 | Dịch vụ lưu tệp trên đám mây của AWS, rất nhiều trang web và ứng dụng dùng. |
| Vùng (region) | Một cụm trung tâm dữ liệu ở một khu vực. Vùng US-EAST-1 là một vùng lớn của AWS. |
| Hệ thống con (subsystem) | Một bộ phận bên trong dịch vụ, làm một việc riêng. |
| Hệ thống chỉ mục (index) | Giữ thông tin về từng đối tượng được lưu: nó nằm ở đâu. |
| Hệ thống phân bổ (placement) | Chọn chỗ lưu cho đối tượng mới. Phụ thuộc vào chỉ mục. |
| Bán kính ảnh hưởng (blast radius) | Một sự cố làm hỏng được bao nhiêu thứ xung quanh. |
| Sổ tay thao tác (playbook) | Các bước đã soạn sẵn cho một việc vận hành. |
1. Một việc vận hành bình thường#
Buổi sáng hôm đó, nhóm S3 đang gỡ lỗi một quy trình tính cước chạy chậm ở vùng US-EAST-1. Một thành viên được ủy quyền làm theo một sổ tay thao tác đã có: gỡ một số ít máy chủ khỏi một hệ thống con liên quan đến tính cước, để xem có giúp ích không.
Không có gì lạ ở đây. Gỡ máy chủ khỏi một hệ thống con là việc thường ngày của người vận hành, và có sổ tay cho nó. Đó là một điểm quan trọng: đây là thao tác được cho phép, theo quy trình, bởi người có quyền.
2. 9:37 sáng: một giá trị nhập sai#
Theo báo cáo, lệnh được chạy lúc 9:37, và một trong các giá trị đầu vào bị nhập sai. Kết quả: nhiều máy chủ hơn dự định bị gỡ.
Báo cáo không nói giá trị nào, sai ra sao hay vì sao. Mình không đoán. Điều có thể nói chắc là công cụ nhận giá trị đó và thực hiện, không có chốt nào kiểm tra "lệnh này sắp gỡ bao nhiêu và có an toàn không".
Số máy chủ bị gỡ lại không thuộc hệ thống tính cước mà thuộc hai hệ thống lõi:
- Chỉ mục (index): giữ siêu dữ liệu và thông tin vị trí của mọi đối tượng trong vùng. Cần cho các yêu cầu lấy, liệt kê, ghi và xóa.
- Phân bổ (placement): cấp chỗ lưu cho đối tượng mới khi có yêu cầu ghi. Phụ thuộc vào chỉ mục hoạt động đúng.
Lấy đi từng đó năng lực thì cả hai phải khởi động lại hoàn toàn.
3. Khởi động lại: việc đã nhiều năm chưa làm#
Đây là chi tiết mình thấy đáng suy ngẫm nhất trong báo cáo. AWS viết rằng họ đã nhiều năm chưa khởi động lại hoàn toàn các hệ thống này ở các vùng lớn. Trong thời gian đó S3 lớn lên rất nhiều, và các bước kiểm tra tính toàn vẹn của siêu dữ liệu cần để khởi động lại an toàn khiến việc này lâu hơn dự kiến.
Nói cách khác: khả năng khôi phục chưa từng được thử ở quy mô hiện tại. Nó giống với bài học của GitLab: một bản sao lưu chưa thử khôi phục thì chưa biết có dùng được, và một quy trình khởi động lại chưa từng chạy ở quy mô thật thì chưa biết mất bao lâu.
4. Dòng thời gian#
Tất cả theo giờ Thái Bình Dương, ngày 28/2/2017, vùng US-EAST-1.
| Giờ | Chuyện gì xảy ra |
|---|---|
| 9:37 | Lệnh chạy, nhiều máy chủ hơn dự định bị gỡ |
| 11:37 | Bảng theo dõi sức khỏe dịch vụ cập nhật được trạng thái từng dịch vụ trở lại |
| 12:26 | Hệ thống chỉ mục đủ năng lực để phục vụ yêu cầu lấy, liệt kê và xóa |
| 1:18 chiều | Hệ thống chỉ mục khôi phục hoàn toàn |
| 1:54 chiều | Hệ thống phân bổ khôi phục xong, S3 hoạt động bình thường |
Từ 9:37 đến 1:54 chiều là khoảng 4 giờ 17 phút. Báo cáo không nêu thời lượng của riêng từng lần khởi động lại.
5. Ai bị ảnh hưởng, và chi tiết trớ trêu về bảng theo dõi#
Theo báo cáo, các dịch vụ bị ảnh hưởng gồm bảng điều khiển S3, việc khởi chạy máy ảo mới (EC2), các ổ đĩa EBS cần dữ liệu từ ảnh chụp lưu trong S3, và AWS Lambda. Một số dịch vụ còn tồn việc trong lúc gián đoạn và cần thêm thời gian để hồi phục.
Chi tiết trớ trêu: bảng điều khiển của trang theo dõi sức khỏe dịch vụ của AWS cũng phụ thuộc vào S3. Đến 11:37 chưa cập nhật được trạng thái từng dịch vụ, nên AWS phải dùng tài khoản Twitter và dòng chữ trên đầu trang để thông báo.
Bài học chung (suy luận của mình): công cụ báo cáo sự cố không nên sống trên chính thứ đang hỏng.
6. Điều gì khiến một lệnh nhầm thành sự cố lớn#
Dựa trên báo cáo, mình thấy năm lớp cùng làm một giá trị nhập sai thành bốn tiếng gián đoạn. Phần diễn giải này là của mình.
| Lớp | Điều báo cáo cho thấy |
|---|---|
| Công cụ cho phép gỡ quá nhiều | Một giá trị nhập sai gỡ được nhiều hơn dự định, không có mức tối thiểu chặn lại. AWS sau đó thêm chốt này |
| Gỡ quá nhanh | AWS sau đó đổi công cụ để gỡ chậm hơn |
| Bán kính ảnh hưởng lớn | Hai hệ thống lõi của cả một vùng, nhiều dịch vụ khác phụ thuộc. AWS sau đó chia nhỏ thành các ô độc lập |
| Khôi phục chưa được thử ở quy mô thật | Khởi động lại lâu hơn dự kiến vì nhiều năm chưa làm đầy đủ |
| Công cụ báo cáo phụ thuộc vào thứ hỏng | Bảng theo dõi dùng S3. AWS sau đó đổi để chạy trên nhiều vùng |
Điểm chung: mỗi lớp đều hợp lý khi đứng riêng, và chỉ khi gặp nhau thì thành sự cố.
7. AWS đã sửa những gì#
Theo báo cáo:
- Gỡ chậm hơn. Công cụ gỡ năng lực được đổi để gỡ với tốc độ thấp hơn.
- Mức tối thiểu. Thêm cơ chế chặn mọi lần gỡ làm hệ thống con xuống dưới mức năng lực tối thiểu cần thiết.
- Rà soát công cụ khác. AWS kiểm tra các công cụ vận hành khác để tìm kiểm tra an toàn tương tự.
- Giảm bán kính ảnh hưởng và rút ngắn khôi phục. Chia nhỏ các hệ thống con thành các ô độc lập. Việc chia nhỏ hệ thống chỉ mục, vốn dự định làm vào cuối năm, được đưa lên làm ngay.
- Bảng theo dõi chạy trên nhiều vùng.
Nhìn chung, AWS không tập trung vào việc cấm một người nhập sai, mà vào việc làm cho nhập sai không gây hại lớn.
8. So với câu chuyện GitLab#
Hai vụ cùng có mô-típ "một lệnh nhầm", nhưng bài học nằm ở các chỗ khác nhau:
| GitLab (1/2017) | Amazon S3 (2/2017) | |
|---|---|---|
| Lệnh nhầm | Xóa thư mục dữ liệu trên máy chính thay vì máy phụ | Một giá trị nhập sai gỡ nhiều máy chủ hơn dự định |
| Điểm yếu chính | Sao lưu không dùng được, dữ liệu mất | Công cụ không có mức tối thiểu, bán kính lớn, khởi động lại chậm |
| Cách xử lý công khai | Tài liệu chung, phát trực tiếp, bản phân tích dài | Báo cáo sau sự cố và thay đổi công cụ |
| Bài học | Khôi phục phải được thử | Công cụ có quyền xóa phải có chốt và mức tối thiểu |
Ghép lại: hãy làm cho lệnh nhầm khó hơn, và làm cho hậu quả của nó nhỏ hơn.
9. Mình rút ra gì: câu hỏi cho công cụ có quyền gỡ#
Phần này là gợi ý của mình, không phải kết luận của AWS. Nếu bạn viết hoặc dùng một công cụ có thể gỡ, xóa, tắt, hãy hỏi:
- Có mức tối thiểu không? Công cụ có chặn mọi thao tác đưa hệ thống xuống dưới mức an toàn không?
- Có giới hạn tốc độ không? Gỡ chậm cho người vận hành thời gian nhận ra sai.
- Có cho xem trước không? Chế độ chỉ liệt kê: "lệnh này sẽ gỡ N máy" trước khi gỡ.
- Bán kính ảnh hưởng là bao nhiêu? Một lệnh nhầm làm hỏng tối đa bao nhiêu?
- Có khôi phục thử ở quy mô thật chưa? Lần cuối bạn khởi động lại cả hệ thống là khi nào?
- Công cụ báo cáo sự cố có sống độc lập không?
- Người thứ hai có nhìn thấy thao tác nguy hiểm không?
10. Khi AI có quyền chạy công cụ#
Câu chuyện này xảy ra năm 2017, nhưng mô-típ rất hiện đại: một công cụ có quyền gỡ, nhận một đầu vào sai, và không có gì chặn. Với AI agent, đầu vào sai có thể đến từ một câu lệnh bị dắt, và agent không "cảm thấy có gì sai".
Đó chính là mục quyền quá rộng (LLM06) trong OWASP Top 10 cho ứng dụng dùng AI: chức năng thừa, quyền thừa, tự chủ thừa. Và các biện pháp ở đó trùng với bài học của AWS: giới hạn chức năng, quyền tối thiểu, bắt người duyệt việc có tác động lớn. Bài MCP là gì nói về cầu chì, và mức tối thiểu của S3 chính là một cầu chì.
11. Nhìn cân bằng#
- Đây là một nguồn chính. Mình dựa vào báo cáo của chính AWS, và báo cáo viết theo góc nhìn của AWS.
- Báo cáo không nêu nhiều chi tiết. Không có tên người, giá trị nhập sai cụ thể hay thời lượng riêng từng lần khởi động lại, nên mình không đoán.
- Phần so sánh và bảng "năm lớp" là diễn giải của mình.
- Sự cố gần mười năm tuổi. Hệ thống đã đổi nhiều, nhưng các nguyên nhân (không có mức tối thiểu, bán kính lớn, khôi phục chưa thử, công cụ phụ thuộc vào thứ hỏng) vẫn rất quen.
- Mình không biết người thực hiện lệnh cảm thấy gì, nên bài không tả điều đó.
12. Kết luận#
Một giá trị nhập sai, bốn tiếng, và một phần internet chậm lại. Nhưng điều AWS chọn sửa không phải là "bảo người vận hành đừng nhập sai". Họ sửa công cụ để lệnh nhầm không gỡ quá nhiều và hệ thống để hậu quả nhỏ hơn. Đó là cách nghĩ đáng học nhất.
Việc nhỏ làm ngay: tìm một công cụ có quyền gỡ hoặc xóa mà bạn đang dùng, và hỏi nó có mức tối thiểu và chế độ xem trước không. Nếu chưa, thêm vào việc cần làm.
Nguồn tham khảo#
Câu hỏi thường gặp
- Chuyện gì đã xảy ra với Amazon S3 ngày 28/2/2017?
- Theo báo cáo sau sự cố của AWS, lúc 9:37 sáng giờ Thái Bình Dương, một thành viên được ủy quyền của nhóm S3 đang gỡ lỗi một quy trình tính cước chậm và chạy lệnh gỡ một số ít máy chủ khỏi một hệ thống con. Một giá trị nhập sai khiến nhiều máy chủ hơn bị gỡ. S3 ở vùng US-EAST-1 chỉ hoạt động bình thường lại lúc 1:54 chiều, và nhiều dịch vụ khác phụ thuộc vào S3 bị ảnh hưởng.
- Vì sao mất bốn tiếng mới khôi phục?
- Các máy chủ bị gỡ phục vụ hai hệ thống con là chỉ mục (quản lý thông tin về mọi đối tượng trong S3) và phân bổ (cấp chỗ lưu cho đối tượng mới). Việc gỡ nhiều năng lực khiến cả hai phải khởi động lại hoàn toàn. AWS cho biết họ đã nhiều năm chưa khởi động lại đầy đủ các hệ thống này ở các vùng lớn, và S3 đã lớn lên cùng các bước kiểm tra tính toàn vẹn dữ liệu khiến việc khởi động lại lâu hơn dự kiến.
- AWS đã sửa những gì sau sự cố?
- Công cụ gỡ năng lực được đổi để gỡ chậm hơn. Thêm cơ chế chặn mọi lần gỡ làm hệ thống con xuống dưới mức năng lực tối thiểu cần thiết. AWS rà soát các công cụ vận hành khác để tìm kiểm tra an toàn tương tự, chia nhỏ các hệ thống con thành các ô độc lập để giảm bán kính ảnh hưởng và đổi bảng theo dõi sức khỏe dịch vụ để chạy trên nhiều vùng.
- Có mất dữ liệu trong sự cố này không?
- Phần mình đọc trong báo cáo của AWS là nói về gián đoạn dịch vụ và quá trình khôi phục, và không nêu mất dữ liệu của khách hàng. Mình không khẳng định thêm ngoài những gì báo cáo viết.