Vấn đề
Một số bug trong hệ thống ERP bán lẻ của chúng tôi chỉ xuất hiện với dữ liệu giống production. Một báo cáo có thể sai riêng cho một cửa hàng, hoặc một phép tính hỏng với một tổ hợp bản ghi mà chẳng ai có trong database local. Để sửa những bug này, kỹ sư cần dữ liệu thực tế ngay trên máy mình.
Cách hiển nhiên là cho kỹ sư truy cập thẳng vào database production, nhưng đó là rủi ro về bảo mật lẫn vận hành. Credential dài hạn sẽ nằm trên laptop, và một lần dump nặng chạy sai chỗ có thể làm chậm hệ thống của người dùng. Chúng tôi cần cách cấp một bộ dữ liệu theo phạm vi khi cần, không có quyền truy cập thường trực, không chạy dump cạnh traffic người dùng, và không để lộ secret vào log của job.
Tôi cùng một đồng nghiệp xây dựng phần này. Tôi làm phần logic export và workflow kích hoạt nó, còn đồng nghiệp phụ trách hạ tầng batch.
Tôi đã làm gì
Chạy export như một batch job, tách khỏi API
Việc export chạy trong container riêng dưới dạng một job trên AWS Batch, với một role có quyền hẹp. Việc dump nặng không bao giờ chạm vào các host đang phục vụ người dùng, và mỗi lần export là một job có ghi nhận và log riêng. Đổi lại, có nhiều thành phần hơn so với một script trên server: job definition, image và role đều phải duy trì. Chúng tôi chấp nhận điều đó để có sự cô lập và dấu vết audit.
Preset theo phạm vi thay vì dump tất cả
Kỹ sư bắt đầu export từ một CI workflow chạy thủ công và chọn preset cho mảng mình cần. Mỗi preset chỉ export phần dữ liệu cần để tái hiện lỗi trong mảng đó. Export nhỏ hơn thì nhanh hơn, lưu trữ rẻ hơn và lộ ít dữ liệu hơn. Cái giá là preset phải cập nhật khi data model thay đổi, và đôi khi kỹ sư cần một phần dữ liệu mà chưa preset nào bao phủ.
Không để credential lọt vào tiến trình con
Công cụ dump chạy như một subprocess. Trước khi khởi động nó, phần export xóa secret kết nối database khỏi môi trường mà subprocess kế thừa, và chỉ truyền những gì công cụ cần. Test kiểm tra hành vi này, nên nó không phụ thuộc vào việc ai đó nhớ quy tắc. Code export vì thế hơi rườm rà hơn, vì phải dựng môi trường cho subprocess một cách tường minh.
Kiểm tra trước khi ghi, xác minh sau khi ghi
Phần export kiểm tra đích đến trước khi upload bất cứ thứ gì. Sau khi upload, nó xác nhận file đã tồn tại trong object storage, và nếu bước nào fail thì xóa các file dở dang. Kỹ sư không bao giờ nhận link tới một snapshot rỗng hay ghi dở. Các bước kiểm tra thêm vài lời gọi cho mỗi lần chạy, quá rẻ so với một buổi debug trên dữ liệu hỏng.
Link tải presigned ngắn hạn
Khi job thành công, workflow tạo một presigned link có thời hạn tới file trên S3 và đăng nó vào run summary. Kỹ sư tải snapshot bằng link đó rồi restore ở local. Không ai cần quyền storage riêng. Đổi lại, link có thể bị chuyển tiếp khi còn hiệu lực, nên thời hạn của nó bị giới hạn và có thể rút ngắn cho từng lần chạy.
Kết quả
Kỹ sư có thể tái hiện các lỗi chỉ xảy ra trên production ngay ở local, từ một snapshot theo phạm vi. Họ tự kích hoạt từ CI và không bao giờ cần credential của database production. Hành vi xử lý secret được bao phủ bằng test tự động, nên đây là một cam kết được kiểm tra ở mỗi lần thay đổi.
Nếu làm lại
Tôi sẽ định nghĩa từng preset cùng với các kỹ sư thường debug mảng đó, vì họ biết một bug cần những bản ghi nào rõ hơn so với việc chỉ nhìn schema. Tôi cũng sẽ đưa lịch sử export, ai chạy preset nào và khi nào, lên một trang dễ đọc để việc rà soát quyền truy cập luôn nhanh gọn.