Chặn truy cập thẳng: giữ bucket private hoàn toàn (bật Block Public Access) và dùng Origin Access Control (OAC). CloudFront ký request tới S3 bằng SigV4; bucket policy chỉ cho phép principal cloudfront.amazonaws.com với Condition khoá đúng ARN của distribution. Người dùng gọi URL S3 trực tiếp sẽ nhận 403. OAC là bản thay thế cho OAI cũ (OAI vẫn chạy nhưng không nên dùng cho thiết lập mới).
Vì sao vẫn thấy file cũ: CloudFront cache theo object ở từng edge location, TTL do Cache-Control của origin hoặc cache policy quyết định. Upload đè lên S3 không làm edge cache mất hiệu lực.
Hai cách xử lý, và câu trả lời tốt là chọn cách thứ hai:
1. Invalidation — gọi API tạo invalidation cho /* hoặc từng path. Nhược điểm: có độ trễ vài phút, chỉ một lượng path nhất định mỗi tháng là miễn phí, phần vượt tính tiền, và dễ thành thói quen "cứ deploy là xoá sạch cache".
2. Versioned filename (khuyến nghị) — build ra app.9f3c2a.js, main.4b81.css. File có hash không bao giờ đổi nội dung, nên đặt Cache-Control: public, max-age=31536000, immutable. Chỉ index.html để TTL ngắn (hoặc no-cache), vì nó là thứ trỏ sang bundle mới. Deploy chỉ cần invalidation cho /index.html, hoặc không cần gì cả.
Giữ nguyên tắc: tài nguyên bất biến thì cache dài, tài liệu điều hướng thì cache ngắn.