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)