Deploy Static Website từ S3 Account Prod qua CloudFront Account Stg với Route 53 Chuyên mục Devops 2025-07-16 0 Lượt xem 0 Lượt thích 0 Bình luận
📌 Mục tiêu
Trong hệ thống có hai tài khoản AWS tách biệt:
-
Account Prod (Production): chứa nội dung website tĩnh trong S3 bucket
-
Account Stg (Staging): chứa CloudFront và quản lý tên miền qua Route 53
Chúng tôi muốn:
-
✅ Lưu trữ nội dung web trong S3 bucket ở account Prod
-
✅ Dùng CloudFront ở account Stg để phân phối website
-
✅ Quản lý DNS (Route 53) và domain certificate ở account Stg
-
✅ Giữ nội dung web ở S3 riêng tư, chỉ CloudFront được phép truy cập
🏗 Kiến trúc tổng quan
User (Browser)
↓
CloudFront (Stg Account)
↓
S3 Private Bucket (Prod Account)
✅ Vì sao chia tách tài khoản?
-
Account Prod:
-
Chứa dữ liệu thật, cần hạn chế truy cập từ bên ngoài
-
Không chứa bất kỳ tài nguyên public nào (CloudFront, DNS...)
-
-
Account Stg:
-
Tập trung quản lý các dịch vụ public-facing: CloudFront, ACM, Route 53
-
Dễ thao tác, phân quyền, scale-out theo môi trường (dev/stg/prod)
-
✅ Vì sao Route 53 phải nằm ở account Stg?
🔒 1. CloudFront ở account khác → không thể chọn Alias nếu Route 53 ở Prod
Trong AWS Route 53, khi bạn tạo bản ghi dạng A – Alias đến CloudFront, AWS sẽ chỉ hiển thị các CloudFront distributions trong cùng tài khoản để chọn từ dropdown.
🛑 Nếu bạn tạo Route 53 ở Prod nhưng CloudFront ở Stg → không thể Alias đúng cách qua giao diện → phải nhập thủ công → dễ lỗi
❌ 2. Root domain không hỗ trợ dùng CNAME
Nếu bạn cố tạo bản ghi CNAME cho root domain (ví dụ: your_domain), bạn sẽ gặp lỗi:
InvalidChangeBatch 400: RRSet of type CNAME with DNS name your_domain. is not permitted at apex in zone believestar.jp.
-
Theo chuẩn DNS quốc tế, root domain (apex record) không được phép là CNAME
-
AWS Route 53 chỉ cho phép bản ghi A – Alias tại root domain trỏ tới CloudFront
✅ → Do đó, Route 53 bắt buộc phải nằm ở cùng account với CloudFront, nếu bạn muốn root domain (your_domain) hoạt động.
🧩 Tổng hợp lợi ích:
Lý do | Mô tả |
---|---|
✅ DNS & CDN cùng account | Dễ dàng gán domain vào CloudFront |
✅ Tự động xác minh SSL | ACM sẽ xác minh DNS nhanh chóng nếu cùng Route 53 |
✅ Root domain dùng Alias | A – Alias chỉ khả dụng với CloudFront cùng account |
❌ CNAME tại root domain bị cấm | Không dùng CNAME tại your_domain |
🔧 Các bước triển khai
1. Tạo S3 bucket ở account Prod
-
Tên bucket: landing-page.your_domain
-
Region: ap-northeast-1
-
Tắt chế độ Static website hosting
-
Bật Block all public access
-
Upload toàn bộ nội dung HTML, JS, CSS...
2. Cấu hình bucket policy để chỉ CloudFront được quyền truy cập
Giả sử bạn đã tạo CloudFront distribution trong account STG:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::landing-page.your_domain/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::[STG_ACCOUNT_ID]:distribution/[DISTRIBUTION_ID]"
}
}
}
]
}
🔐 Lưu ý: bạn phải dùng Origin Access Control (OAC), vì đây là phương pháp hiện đại hơn OAI, và hỗ trợ cross-account truy cập an toàn.
3. Tạo CloudFront Distribution ở account Stg
-
Origin domain:
landing-page.your_domain.s3.ap-northeast-1.amazonaws.com
-
Origin protocol policy: HTTPS Only
-
Viewer protocol policy: Redirect HTTP to HTTPS
-
Origin Access: Tạo mới OAC và liên kết với S3 origin
4. Cấp SSL + cấu hình domain tùy chỉnh
-
Vào AWS Certificate Manager (ACM) tại region us-east-1
-
Yêu cầu SSL certificate cho domain:
your_domain
-
Nếu Route 53 cũng nằm ở account STG:
-
ACM sẽ tự động tạo bản ghi xác minh (DNS validation) → ✅ dễ dàng
-
-
Gán SSL vào CloudFront
-
Cập nhật Alternate Domain Names (CNAMEs) trong CloudFront với:
your_domain
5. Cấu hình Route 53 ở account Stg
-
Tạo (hoặc dùng sẵn) Hosted Zone cho domain your_domain
-
Tạo bản ghi:
Type Name Value (Alias) A your_domain Alias → chọn đúng CloudFront distribution
📌 Ghi nhớ: không thể tạo CNAME cho root domain, vì chuẩn DNS không cho phép.
✅ Chỉ có bản ghi A – Alias trỏ về CloudFront mới hoạt động với root domain.
✅ Kiểm tra checklist
Mục | Trạng thái |
---|---|
S3 bucket ở account Prod | ✔ |
CloudFront ở account Stg | ✔ |
OAC kết nối cross-account | ✔ |
SSL xác minh thành công | ✔ |
Route 53 trỏ đúng root domain bằng A – Alias | ✔ |
✅ Kết quả đạt được
-
CloudFront phân phối nội dung từ S3 Prod một cách an toàn và riêng tư
-
Route 53, SSL, và CDN đều nằm trong account Stg – public-facing
-
Root domain (your_domain) hoạt động bình thường nhờ bản ghi Alias
⚠️ Một số lưu ý
-
Tuyệt đối không bật static website hosting nếu bạn muốn bảo mật bằng OAC
-
Sử dụng đúng S3 REST endpoint, không phải static website endpoint
-
Với root domain, luôn phải dùng bản ghi A – Alias, không dùng được CNAME
🧠 Kết luận
Tách biệt CloudFront và S3 giữa 2 account giúp tăng cường bảo mật, kiểm soát tốt hơn và linh hoạt cho vận hành.
Đặt Route 53 và CloudFront ở cùng tài khoản (STG) là giải pháp bắt buộc và hợp lý nhất, nhất là khi bạn muốn phục vụ root domain (your_domain) qua CloudFront.
Bình luận (0)