Khắc phục lỗi màn hình trắng do không tải được tệp tĩnh khi triển khai bằng AWS S3 + CloudFront
(blog.lemonbase.team)Đây là bài viết về cách giải quyết vấn đề màn hình trắng do không tải được tệp tĩnh khi triển khai bằng AWS S3 + CloudFront. Hy vọng bài viết sẽ hữu ích với những ai đang cân nhắc một phương án triển khai tệp tĩnh ổn định bằng AWS S3 + CloudFront.
[Bối cảnh phát sinh vấn đề]
- Vận hành dịch vụ frontend dựa trên React + Vite
- Sau khi triển khai thỉnh thoảng xuất hiện màn hình trắng → không tải được tệp tĩnh
- Lỗi trên console: không khớp MIME type (trả về
text/html)
[Phân tích vấn đề]
- Không khớp MIME type: trả về phản hồi HTML thay vì tệp tĩnh
- Giả thuyết: Github Actions bị hủy → instance ECS bị xóa
- Thời điểm triển khai và việc phục vụ tệp tĩnh không đồng bộ
index.htmlcủa phiên bản cũ tham chiếu tới tệp tĩnh mới nhưng tệp đã bị xóa
[Cách giải quyết]
- Sử dụng CloudFront + S3 (quyết định cuối cùng)
- Dùng đường dẫn tuyệt đối của S3 để giữ lại tệp tĩnh của phiên bản trước
- Khi build bằng Vite, thêm
commitHash,timestampvào tên tệp → đảm bảo tính duy nhất - Thiết lập S3 Lifecycle để tự động xóa các tệp không cần thiết
- Kết nối CloudFront để phục vụ tệp tĩnh nhanh và ổn định
- Cấu hình riêng cho các môi trường Local, Dev, Prod
[Kết quả kiểm chứng]
- Xác nhận phương án CloudFront + S3 hoạt động bình thường
- Áp dụng chiến lược cache: kiểm tra cache trình duyệt (
Cache-Control,max-age) - Do mỗi tệp có tính duy nhất nên không cần vô hiệu hóa cache
- Có thể triển khai ổn định mà không còn vấn đề thiếu tệp tĩnh như trước
[Điều rút ra]
- Trong môi trường triển khai, việc quản lý tệp tĩnh có thể ảnh hưởng lớn đến UX.
- Khi kiểm chứng giả thuyết, cách tiếp cận nhanh và đơn giản là rất quan trọng
- Có thêm kinh nghiệm tối ưu môi trường triển khai bằng S3 + CloudFront
- Cần phân biệt chiến lược triển khai theo từng môi trường (Local, Dev, Prod)
- Cần hiểu rõ cách hoạt động của cache trình duyệt (
Cache-Control,from disk cache)
1 bình luận
Vì là rolling nên đương nhiên sẽ có vấn đề. Chỉ cần rút ngắn thời gian deploy hoặc tách deploy ra và dồn traffic về một phía theo chiến lược blue-green là được.
Hoặc cũng có thể bắt lỗi trong React rồi ép reload.