Daniel Nguyen
← Tất cả dự án

Export dữ liệu production theo phạm vi để debug local

Cùng xây một luồng export theo yêu cầu, chụp một phần dữ liệu production trong batch job và trao cho kỹ sư một link tải ngắn hạn.

TTMI
Không cần quyền DBSnapshot theo phạm vi qua link ngắn hạn
Mảng
Nền tảng ERP bán lẻ
Thời gian
2025–2026
Vai trò
Cùng xây dựng
  • Python
  • PostgreSQL
  • AWS Batch
  • Amazon S3
  • Docker
  • GitHub Actions
  • pytest

Các phần ghép với nhau thế nào

Export dữ liệu production theo phạm vi để debug localAn engineer triggers a scoped export that runs as a batch job and comes back as a short-lived download link.Engineerngười dùngManual CI workflowdịch vụBatch job queuehàng đợiExport containerworkerProduction databasekho dữ liệuObject storagekho dữ liệuPresigned linkbên ngoàiLocal environmentngười dùngpick scope presetsubmit export jobstartread scoped dataupload + verifysign link on successtime-limited URLdownload + restore
An engineer triggers a scoped export that runs as a batch job and comes back as a short-lived download link.
  • Người dùng
  • Dịch vụ
  • Hàng đợi
  • Worker
  • Kho dữ liệu
  • Bên ngoài

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.

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.