Cấu Hình Tên Miền Riêng S3 Storage Bằng Cloudflare Workers
Sử dụng các dịch vụ lưu trữ tương thích S3 (S3-compatible storage) như FPT Cloud, DigitalOcean Spaces, hoặc MinIO là một giải pháp tuyệt vời để lưu trữ file tĩnh, hình ảnh, hoặc file cài đặt (như file .tar.gz). Tuy nhiên, nhược điểm lớn nhất là đường link mặc định thường rất dài và thiếu chuyên nghiệp (ví dụ: https://vn-fpt.azcloudstorage.com/tobi/image.png).
Bài viết này sẽ hướng dẫn bạn cách sử dụng Cloudflare để bọc tên miền riêng (ví dụ: cdn.quyenlt.com) cho bucket S3 của bạn.
Tại sao không dùng CNAME hay Origin Rules thông thường?
Theo phản xạ tự nhiên, nhiều quản trị viên hệ thống sẽ tạo một bản ghi CNAME trỏ thẳng cdn về endpoint của S3. Tuy nhiên, cách này thường trả về lỗi kinh điển:
<Error>
<Code>NoSuchBucket</Code>
<Message>The specified bucket does not exist</Message>
</Error>
Nguyên nhân: Máy chủ S3 nhận được yêu cầu với Host Header là tên miền của bạn, nên nó cố gắng tìm một bucket có tên y hệt như vậy thay vì bucket thực tế.
Để sửa lỗi này, bạn cần ghi đè (Rewrite) Host Header và SNI. Đáng tiếc là giao diện hiện tại của Cloudflare đã khóa tính năng này trong Origin Rules và yêu cầu nâng cấp lên gói Enterprise đắt đỏ.
Giải pháp: Sử dụng Cloudflare Workers (Miễn phí 100.000 lượt yêu cầu/ngày) để làm proxy trung gian đánh lừa máy chủ S3.
Các Bước Cấu Hình Bằng Cloudflare Workers
Trong ví dụ này, chúng ta sẽ trỏ tên miền cdn.quyenlt.com về endpoint vn-fpt.azcloudstorage.com với bucket tên là tobi.
Bước 1: Tạo Cloudflare Worker mới
Đăng nhập vào trang quản trị Cloudflare, chọn menu Workers & Pages ở cột bên trái.

Bấm Create application

Chọn Start with Hello World! .

Đặt tên cho Worker (ví dụ: s3-custom-domain-proxy) và bấm Deploy.

Bước 2: Chèn mã định tuyến (Proxy Code)
-
Ngay sau khi Deploy thành công, bấm vào nút Edit code.

Xóa toàn bộ mã mặc định và dán đoạn mã Javascript dưới đây vào:
export default {
async fetch(request) {
const url = new URL(request.url);
// Đổi hostname sang Endpoint S3 gốc của bạn
url.hostname = "vn-fpt.azcloudstorage.com";
// Khởi tạo request mới và ép Host header chuẩn để server S3 không báo lỗi 403/404
const newRequest = new Request(url.toString(), new Request(request));
newRequest.headers.set('Host', 'vn-fpt.azcloudstorage.com');
return fetch(newRequest);
}
};

Bấm Deploy ở góc phải màn hình để lưu lại cấu hình.
Bước 3: Gắn tên miền Custom Domain vào Worker
Quay lại trang cài đặt của Worker vừa tạo. Bấm vào Settings.
Tìm phần Domains & Routes > Add

Sau đó chọn Custom domain.

Nhập tên miền bạn muốn sử dụng (ví dụ: cdn.quyenlt.com) và bấm Add. Cloudflare sẽ tự động lo phần cấu hình DNS và cấp chứng chỉ bảo mật SSL/HTTPS cho bạn.

Sau 1-2 phút cập nhật, bạn đã có thể truy cập file công khai của mình thông qua đường link cực kỳ gọn gàng!
⚠️ Những Hạn Chế Quan Trọng Cần Biết
Mặc dù giải pháp này miễn phí và hiệu quả cho việc phân phối nội dung (CDN), bạn cần lưu ý những điểm yếu sau trước khi áp dụng vào môi trường thực tế (Production):
-
Chỉ dành cho thao tác Đọc/Tải xuống (GET Requests): Link Custom Domain này sinh ra để phục vụ việc chia sẻ file công khai, nhúng hình ảnh/file tĩnh vào website. Nếu bạn dùng nó để tải lên (Upload) hoặc xóa file qua các công cụ như Cyberduck hay AWS CLI, lệnh sẽ thất bại. Để quản trị, bạn bắt buộc phải dùng link S3 gốc.
-
Không hoạt động với Presigned URL: Các đường link tải tạm thời (có thời hạn) chứa một chữ ký bảo mật được hash dựa trên tên miền gốc. Nếu ép chạy qua tên miền mới, chữ ký sẽ sai lệch, máy chủ S3 sẽ lập tức chặn lại bằng lỗi
SignatureDoesNotMatch. -
Giới hạn của gói Free: Cloudflare Workers gói miễn phí giới hạn ở mức 100.000 requests/ngày. Nếu website của bạn có lượng truy cập cực kỳ lớn, bạn sẽ cần cân nhắc nâng cấp lên gói trả phí của Workers (chỉ $5/tháng, rẻ hơn rất nhiều so với bản Enterprise).
-
Bắt buộc phải Public file: Thao tác đổi URL này không bỏ qua được cơ chế phân quyền (ACL). File trên bucket vẫn phải được set quyền
Public-Readthì đường link mới hoạt động.