Amazon CloudFront – Bài 18

Amazon CloudFront là dịch vụ Content Delivery Network (CDN) do AWS cung cấp, được thiết kế nhằm tăng tốc độ phân phối nội dung web như hình ảnh, video, file HTML/CSS/JS đến người dùng trên toàn cầu một cách hiệu quả và an toàn.

Xem thêm:

Tổng quan về Amazon Route 53 – Bài 15

Amazon S3 – Bài 16

Amazon CloudWatch – Bài 17

1. CloudFront hoạt động như thế nào?

CloudFront hoạt động bằng cách cache nội dung của bạn tại các Edge Location – đây là những trung tâm dữ liệu đặt ở nhiều vị trí địa lý trên toàn thế giới (hiện có hơn 216 điểm hiện diện – Points of Presence).

Khi người dùng yêu cầu truy cập nội dung:

  • Lần đầu tiên, Edge Location gần nhất sẽ lấy nội dung từ origin (nguồn gốc – thường là S3 bucket, EC2, Load Balancer, hoặc HTTP server).
  • Nội dung sau đó được lưu tạm tại Edge Location.
  • Các yêu cầu tiếp theo từ cùng khu vực sẽ được phục vụ trực tiếp từ Edge đó, giảm độ trễ, tăng tốc độ phản hồi, và tiết kiệm băng thông gốc.

2. Lợi ích chính của CloudFront

Hiệu năng toàn cầu: Người dùng từ bất kỳ đâu cũng được phục vụ nội dung nhanh chóng nhờ các Edge Location gần họ.

Bảo mật tích hợp: CloudFront tích hợp với AWS Shield và AWS WAF để chống lại tấn công DDoS và bảo vệ ứng dụng web.

Tiết kiệm chi phí: Cache nội dung tại Edge giúp giảm số lần truy xuất về origin, đặc biệt là với dữ liệu tĩnh.

Tăng độ sẵn sàng: Phân phối nội dung toàn cầu giúp giảm tải cho origin, từ đó nâng cao khả năng mở rộng của hệ thống.

3. Các loại Origin CloudFront hỗ trợ

CloudFront có thể truy xuất nội dung từ nhiều loại nguồn (origin), bao gồm:

Loại Origin Mô tả
Amazon S3 Phục vụ nội dung tĩnh như hình ảnh, CSS, JS. Có thể kết hợp với OAC (Origin Access Control) để hạn chế truy cập chỉ qua CloudFront.
Application Load Balancer / EC2 / VPC Endpoint Dùng khi bạn muốn CloudFront truy xuất tới ứng dụng động được triển khai trong VPC.
Custom HTTP/HTTPS Origin Các web server bên ngoài AWS hoặc server tự quản lý hỗ trợ HTTP.

4. Quy trình hoạt động của CloudFront

  • Người dùng gửi yêu cầu đến CloudFront Distribution (qua Edge Location gần nhất).
  • Nếu nội dung chưa được cache → Edge sẽ truy xuất dữ liệu từ Origin.
  • Kết quả được cache lại tại Edge Location theo thời gian TTL (Time to Live).
  • Những yêu cầu tiếp theo được xử lý nhanh chóng từ cache tại Edge – không cần về Origin nữa.

Ví dụ:

  • Một website được lưu trữ trên S3 tại Sydney (Úc).
  • Người dùng tại Mỹ truy cập trang web sẽ được phục vụ qua Edge Location tại Mỹ.
  • Nếu nội dung chưa có sẵn tại Edge này, CloudFront sẽ tải nội dung từ S3 Sydney về và lưu cache lại.

5. CloudFront vs. S3 Cross-Region Replication

Tiêu chí CloudFront (CDN) S3 Cross-Region Replication
Mục đích Cache tạm thời để phân phối nội dung nhanh toàn cầu Nhân bản dữ liệu giữa các vùng để bảo vệ/đồng bộ
Phân phối Hơn 200+ Edge Location toàn cầu Cần cấu hình từng cặp bucket riêng biệt
Loại dữ liệu phù hợp Dữ liệu tĩnh, cần truy cập nhanh từ nhiều nơi Dữ liệu động cần sao chép chính xác
Cập nhật nội dung Thời gian lưu cache ngắn, cập nhật khi hết TTL Đồng bộ theo thời gian thực gần đúng (near real-time)
Tính chất Chỉ đọc (read-only), không ghi dữ liệu Ghi và sao chép dữ liệu đầy đủ

6. Kết nối CloudFront với ALB hoặc EC2

Trong quá trình thiết kế hệ thống phân phối nội dung (CDN), CloudFront thường được sử dụng như lớp đầu tiên để tăng tốc và bảo vệ ứng dụng. Một câu hỏi quan trọng đặt ra: Làm thế nào để CloudFront có thể kết nối tới các tài nguyên backend như Application Load Balancer (ALB), Network Load Balancer (NLB) hoặc EC2 mà vẫn đảm bảo bảo mật tối đa?

Phương pháp mới: Sử dụng VPC Origins (Private Integration)

Đây là phương pháp hiện đại và bảo mật hơn, không cần public các tài nguyên backend. Với tính năng VPC Origin, CloudFront có thể truy cập trực tiếp các tài nguyên nằm trong private subnet của VPC, bao gồm:

  • Application Load Balancer (ALB)
  • Network Load Balancer (NLB)
  • EC2 Instances

Cách hoạt động

  • Người dùng truy cập nội dung thông qua một CloudFront distribution, được phân phối từ các edge location toàn cầu.
  • CloudFront sử dụng một VPC link để tạo kết nối riêng tư tới các tài nguyên backend nằm trong private subnet.
  • Các kết nối này được thực hiện nội bộ trong AWS, không qua Internet.
  • Bạn có thể giới hạn nội dung, kiểm soát traffic, bật bảo vệ DDoS và sử dụng WAF mà không cần public backend.

Ưu điểm

  • Không cần mở public IP cho ALB/EC2
  • Không cần whitelist IP của CloudFront
  • An toàn hơn nhờ sử dụng private link
  • Dễ dàng kiểm soát quyền truy cập qua IAM và Security Group

Phương pháp cũ: Public Integration thông qua IP Whitelisting

Trước khi có VPC Origins, để kết nối CloudFront với backend, bắt buộc backend (EC2 hoặc ALB) phải có public IP. Để đảm bảo chỉ CloudFront có quyền truy cập, ta dùng cách whitelist IP các edge location của CloudFront.

Cách hoạt động

  • EC2/ALB phải được triển khai công khai (có public IP).
  • Truy cập được giới hạn bằng cách:
    • Tải danh sách IP của CloudFront từ AWS IP Ranges: https://ip-ranges.amazonaws.com/ip-ranges.json
    • Cấu hình Security Group để chỉ cho phép các dải IP của CloudFront truy cập.
  • Trong trường hợp ALB:
    • ALB public, EC2 private
    • Giao tiếp nội bộ giữa ALB và EC2 vẫn dùng private subnet và security group

Nhược điểm

  • Tốn công sức: Phải thường xuyên cập nhật IP CloudFront
  • Không an toàn nếu security group bị thay đổi sai
  • Backend bắt buộc phải có public exposure

So sánh tổng quan: VPC Origins vs Public Integration

Tiêu chí VPC Origins (Mới) Public Integration (Cũ)
Bảo mật Cao – kết nối private Trung bình – cần IP public
Dễ quản lý Dễ – không cần IP whitelist Khó – phải cập nhật IP CloudFront
Triển khai Backend Private subnet Public subnet hoặc ALB public
Rủi ro cấu hình sai Thấp Cao

7. Giới hạn truy cập theo địa lý (Geo Restriction)

Amazon CloudFront Geo Restriction là một tính năng bảo mật cho phép bạn kiểm soát ai có thể truy cập vào nội dung phân phối dựa trên vị trí địa lý – cụ thể là quốc gia của người dùng đang cố gắng truy cập.

Cơ chế hoạt động

CloudFront sử dụng cơ sở dữ liệu Geo-IP từ bên thứ ba để xác định quốc gia của người dùng dựa trên địa chỉ IP. Từ đó, hệ thống sẽ áp dụng quy tắc cho phép (allowlist) hoặc chặn (blocklist) tương ứng.

Các phương pháp hạn chế

  • Allowlist: Chỉ cho phép các quốc gia được liệt kê truy cập vào phân phối CloudFront. Tất cả các quốc gia khác sẽ bị chặn.
  • Blocklist: Chặn các quốc gia được liệt kê, trong khi cho phép tất cả các quốc gia khác.

Cách cấu hình Geo Restriction trong CloudFront

  1. Truy cập bảng điều khiển CloudFront trên AWS Console.
  2. Chọn Distribution cần áp dụng.
  3. Đi tới mục Security.
  4. Tìm phần Geographic restrictions và nhấp Edit.
  5. Chọn chế độ Allowlist hoặc Blocklist, sau đó nhập các quốc gia tương ứng.
  6. Lưu lại các thay đổi.

8. Hiểu về Cache Invalidation trong Amazon CloudFront

Trong hệ thống phân phối nội dung (CDN) như Amazon CloudFront, việc sử dụng bộ nhớ đệm (cache) tại các điểm biên (edge locations) giúp cải thiện hiệu suất truy cập nội dung cho người dùng cuối. Tuy nhiên, điều này cũng mang đến một thách thức: khi bạn cập nhật nội dung ở nguồn gốc (origin), các edge location sẽ không tự động biết có sự thay đổi cho đến khi TTL (Time To Live) của cache hết hạn.

Vấn đề: Cache chưa phản ánh nội dung mới

Ví dụ: nếu TTL được đặt là 1 ngày, thì dù bạn đã cập nhật file index.html hoặc một hình ảnh trong bucket S3 gốc, người dùng vẫn sẽ nhận phiên bản cũ từ edge location trong vòng 24 giờ tiếp theo.

Giải pháp: Thực hiện Invalidation

Để đảm bảo người dùng nhận được nội dung mới ngay lập tức, bạn có thể thực hiện một hành động gọi là invalidation. Đây là quá trình thủ công yêu cầu CloudFront loại bỏ các tệp cụ thể khỏi bộ nhớ đệm của các edge location.

Phạm vi Invalidation

  • /index.html – chỉ xóa file cụ thể này khỏi cache.
  • /images/* – xóa toàn bộ các tệp trong thư mục images.
  • /* – xóa tất cả các tệp khỏi cache (thường chỉ dùng khi thực sự cần thiết vì có thể tốn nhiều thời gian và tài nguyên).

Cách hoạt động của Cache Invalidation

  1. Bạn cập nhật nội dung (ví dụ: file index.html và các hình ảnh) trên nguồn gốc, chẳng hạn như Amazon S3.
  2. Thực hiện một yêu cầu Invalidation cho các đường dẫn liên quan.
  3. CloudFront gửi tín hiệu đến tất cả edge location để xóa những file này khỏi bộ nhớ đệm cục bộ.
  4. Lần tiếp theo người dùng yêu cầu nội dung, edge location sẽ không tìm thấy file trong cache, và buộc phải lấy phiên bản mới nhất từ origin.

Lưu ý khi sử dụng Invalidation

  • CloudFront cung cấp một số lượng yêu cầu invalidation miễn phí hàng tháng, nhưng vượt mức này có thể tính phí.
  • Không nên lạm dụng việc xóa toàn bộ cache vì có thể ảnh hưởng đến hiệu suất hệ thống.

9. CloudFront with S3 – Hands On

Mục tiêu: Thiết lập một hệ thống phân phối nội dung toàn cầu bằng Amazon CloudFront để truy cập nội dung từ một S3 bucket riêng tư, đồng thời đảm bảo bảo mật bằng Origin Access Control (OAC).

Bước 1: Tạo S3 bucket chứa nội dung

  1. Truy cập Amazon S3 Console
  2. Chọn Create bucket
  3. Đặt tên bucket: demo-cloudFront
  4. Giữ nguyên các cấu hình mặc định và nhấn Create bucket
  5. Upload các file như: index.html, coffee.jpeg, beach.jpeg

Bước 2: Kiểm tra file chưa public

  1. Mở file index.html trong bucket
  2. Chọn Object URL
  3. Bạn sẽ thấy lỗi Access Denied vì file chưa được công khai – điều này đúng với yêu cầu bảo mật

Bước 3: Tạo CloudFront distribution sử dụng OAC

  1. Truy cập CloudFront Console
  2. Chọn Create distribution
  3. Trong phần Origin, chọn:
    • Origin domain: demo-cloudFront
    • Origin access: Origin access control settings (recommended)
  4. Nhấn Create control setting → đặt tên tùy ý → nhấn Create
  5. Trong Default root object: nhập index.html
  6. Chọn Create distribution

Bước 4: Cập nhật S3 bucket policy

  1. Sau khi tạo distribution, CloudFront sẽ hiển thị cảnh báo cần cập nhật bucket policy
  2. Chọn Copy policy
  3. Truy cập lại S3 Console → Chọn bucket demo-cloudFront
  4. Vào PermissionsBucket policy → Chọn Edit
  5. Dán đoạn policy đã copy vào

Policy mẫu:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFrontServicePrincipalReadOnly",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::demo-cloudFront-stephane-V4/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::YOUR_ACCOUNT_ID:distribution/YOUR_DISTRIBUTION_ID"
        }
      }
    }
  ]
}

Ghi chú: Thay thế YOUR_ACCOUNT_IDYOUR_DISTRIBUTION_ID bằng thông tin thực tế.

Bước 5: Truy cập nội dung qua CloudFront

  1. Quay lại CloudFront Console và đợi trạng thái distribution chuyển thành Deployed
  2. Copy Distribution Domain Name, ví dụ: d1234abcde.cloudfront.net
  3. Truy cập các URL như:
    • https://d1234abcde.cloudfront.net/index.html
    • https://d1234abcde.cloudfront.net/coffee.jpeg

Bước 6: Kiểm tra và xác minh cache CloudFront

  1. Làm mới trình duyệt
  2. Bạn sẽ thấy nội dung được tải từ Edge Location thay vì trực tiếp từ S3
  3. CloudFront giúp tăng tốc độ truy cập toàn cầu và giảm tải cho S3

 

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em