Quay lại

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    comment-3 Created with Sketch Beta. 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.
Vì sao?
  • 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.


📎 Tham khảo thêm

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday