Amazon CloudFront
CDN, Edge Locations, Caching, Lambda@Edge, Security
Tổng quan
Amazon CloudFront là dịch vụ Content Delivery Network (CDN) của AWS, giúp phân phối nội dung (web, API, video, static files) đến người dùng toàn cầu với độ trễ thấp và tốc độ cao.
CDN là gì?
Lợi ích chính:
- Giảm latency: Content được cache gần người dùng
- Giảm tải origin: Không phải request đến origin mỗi lần
- Tăng availability: Nhiều edge locations = redundancy
- Bảo mật: DDoS protection, WAF integration
Kiến trúc CloudFront
Các thành phần chính
1. Edge Locations
- 750+ PoPs (Points of Presence) trên toàn cầu
- 100+ cities, 50+ countries
- Là nơi content được cache gần người dùng nhất
- Tự động route request đến edge location gần nhất
2. Regional Edge Caches
- Mid-tier cache giữa Edge Locations và Origin
- Cache lớn hơn, giữ content lâu hơn
- Giảm số request đến Origin
3. Origin Shield (Optional)
- Centralized caching layer bổ sung
- Tất cả regional edge caches đều đi qua Origin Shield
- Giảm tải origin đáng kể cho high-traffic sites
Tại sao cần Origin Shield?
- Có 13+ Regional Edge Caches trên toàn cầu
- Không có Origin Shield: mỗi Regional Cache fetch từ Origin riêng = 13+ requests cho cùng 1 file
- Có Origin Shield: tất cả Regional Caches đi qua 1 điểm = 1 request đến Origin
- Đặc biệt hữu ích cho: high-traffic sites, origins có capacity giới hạn, origins tính phí per-request
Origins (Nguồn nội dung)
CloudFront hỗ trợ nhiều loại origin:
1. S3 Bucket
Origin Access Control (OAC) - Cách mới (khuyến nghị):
2. Application Load Balancer (ALB)
3. EC2 Instance
4. Custom HTTP Server
5. Origin Groups (Failover)
Cache Behaviors
Cách hoạt động của Cache
CloudFront Domain - Quan trọng!
Khi tạo Distribution, CloudFront cấp cho bạn một domain riêng:
⚠️ Cache CHỈ hoạt động khi request đi qua CloudFront domain:
Thường dùng custom domain (qua Route 53):
Trong code frontend, phải dùng đúng URL:
CloudFront Cache những gì?
CloudFront KHÔNG cache mọi thứ mặc định - bạn control hoàn toàn:
| Content Type | Cache mặc định? | Lý do |
|---|---|---|
| Static files (.jpg, .css, .js) | ✅ Thường có | Origin set Cache-Control |
| HTML pages | ⚠️ Tùy config | Phụ thuộc Cache Behavior |
| API responses (GET) | ⚠️ Tùy config | Thường disable cache |
| POST/PUT/DELETE | ❌ Không bao giờ | Modifying requests |
Quy tắc quyết định cache:
AWS Managed Cache Policies:
| Policy | Behavior | Use Case |
|---|---|---|
| CachingDisabled | Không cache, forward tất cả | APIs, dynamic content |
| CachingOptimized | Cache theo origin headers | Static assets |
| CachingOptimizedForUncompressedObjects | Như trên, không compress | Already compressed files |
Ví dụ config theo path:
Cache Key
CloudFront cache key mặc định là: Host + Path
Có thể customize bằng:
- Query strings
- Headers
- Cookies
TTL (Time To Live)
Quy tắc ưu tiên:
- Origin
Cache-Control: max-age=X→ dùng X (nếu MinTTL ≤ X ≤ MaxTTL) - Origin không set → dùng DefaultTTL
- Origin set
no-cache→ request đến origin mỗi lần (nhưng vẫn có thể serve stale if-modified)
Cache Behaviors Patterns
CloudFront Functions vs Lambda@Edge
Tại sao cần chạy code ở Edge?
Đôi khi bạn cần xử lý logic trước khi CloudFront trả response. Ví dụ:
- Redirect
/old-page→/new-page - Thêm security headers
- Check authentication
- A/B testing
AWS cho bạn 2 cách:
Request đi qua Function như thế nào?
Trường hợp 1: Function MODIFY request rồi cho đi tiếp
Trường hợp 2: Function TRẢ RESPONSE LUÔN (không đến Origin)
Tóm lại:
- Return
request→ Request đi tiếp (có thể đã bị modify) - Return
response→ Dừng luôn, trả response cho user
4 điểm có thể đặt Function (Trigger Points)
| Điểm | Khi nào chạy? | Dùng để làm gì? |
|---|---|---|
| ① Viewer Request | Mỗi request từ user | Redirect, auth check, modify URL |
| ② Origin Request | Chỉ khi cache miss | Thêm headers cho origin |
| ③ Origin Response | Nhận response từ origin | Modify trước khi cache |
| ④ Viewer Response | Trước khi trả cho user | Thêm security headers |
So sánh CloudFront Functions vs Lambda@Edge
| Feature | CloudFront Functions | Lambda@Edge |
|---|---|---|
| Tốc độ | ⚡ < 1ms | 🐢 Viewer: 5s, Origin: 30s |
| Giá | 💰 $0.10/1M | 💰💰 $0.60/1M + compute |
| Gọi API/DB | ❌ KHÔNG | ✅ Có |
| Language | JavaScript only | Node.js, Python |
| Trigger Points | ① và ④ only | ①②③④ (tất cả) |
| Use Case | Việc đơn giản | Logic phức tạp |
CloudFront Functions - "Nhẹ và nhanh"
Lambda@Edge - "Mạnh mẽ hơn"
Khi nào dùng cái nào?
| Việc cần làm | Dùng gì? | Lý do |
|---|---|---|
| Redirect URL | CloudFront Functions | Đơn giản, không cần API |
| Thêm security headers | CloudFront Functions | Chỉ modify response |
| URL rewrite | CloudFront Functions | String manipulation |
| Check JWT token | Lambda@Edge | Cần verify signature |
| Resize ảnh | Lambda@Edge | Cần gọi S3 |
| A/B testing với DB | Lambda@Edge | Cần đọc config |
Rule of thumb: Nếu CloudFront Functions làm được → dùng nó (rẻ + nhanh hơn)
Security Features
1. HTTPS/SSL
Lưu ý quan trọng: SSL certificate cho CloudFront phải ở region us-east-1!
2. Origin Access Control (OAC)
OAC là gì?
OAC (Origin Access Control) là cơ chế cho phép CloudFront access S3 bucket private.
Tại sao cần OAC (signing) khi đã có Bucket Policy?
Bucket Policy chỉ định nghĩa "AI được phép", không verify "đó có thật là CloudFront không":
Cách OAC hoạt động:
OAC vs OAI (cũ):
| Feature | OAI (Legacy) | OAC (Mới - 2022) |
|---|---|---|
| Signing | CloudFront identity | AWS Signature V4 |
| SSE-KMS | ❌ Không hỗ trợ | ✅ Hỗ trợ |
| POST/PUT | ❌ Chỉ GET | ✅ Tất cả methods |
| All regions | ❌ Một số | ✅ Tất cả |
| Recommended | ❌ | ✅ |
Origins hỗ trợ OAC:
| Origin Type | OAC Support | Cách bảo mật khác |
|---|---|---|
| S3 | ✅ | - |
| MediaStore | ✅ | - |
| Lambda Function URL | ✅ | - |
| ALB/EC2 | ❌ | Custom header + Security Group |
| API Gateway | ❌ | IAM / API Key |
Setup OAC:
- Tạo OAC trong CloudFront Console (Origin settings)
- S3 giữ "Block Public Access: ON"
- Thêm Bucket Policy cho CloudFront:
Lưu ý về S3 Endpoint:
| S3 Endpoint | OAC Support |
|---|---|
bucket.s3.region.amazonaws.com (REST API) | ✅ Có |
bucket.s3-website-region.amazonaws.com (Website) | ❌ Không |
Nếu dùng S3 Website Endpoint → không có OAC → S3 phải public.
3. Signed URLs / Signed Cookies
CloudFront Signed URLs và Signed Cookies là cơ chế để phân phối private/restricted content chỉ cho người dùng đã được ứng dụng của bạn cấp quyền.
💡 Câu hỏi cần nhớ: đây là cơ chế kiểm soát ai được xem content ở CloudFront edge, không phải chỉ là mã hóa đường truyền tới origin.
AWS nói gì?
- CloudFront Signed URLs và Signed Cookies "allow you to control who can access your content"
- Signed URL phù hợp khi muốn giới hạn truy cập tới từng file riêng lẻ
- Signed Cookie phù hợp khi muốn truy cập nhiều file restricted như HLS segments hoặc khu vực subscriber-only
Khi nào dùng cái nào?
| Trường hợp | Nên dùng |
|---|---|
| Download 1 file private | Signed URL |
| Video streaming gồm nhiều segments/files | Signed Cookies |
| Client không hỗ trợ cookies | Signed URL |
| Muốn giữ nguyên URL hiện tại | Signed Cookies |
| Subscriber area với nhiều object | Signed Cookies |
Ví dụ dễ nhớ:
Diagram - cách hoạt động
Signed URL vs Signed Cookie
| Tiêu chí | Signed URL | Signed Cookies |
|---|---|---|
| Phạm vi | 1 file / 1 request cụ thể | Nhiều file |
| URL có thay đổi không | ✅ Có thêm tham số ký | ❌ Không cần đổi URL file |
| Hợp với | Download riêng lẻ | Streaming, subscriber area |
| Client không hỗ trợ cookies | ✅ Tốt | ❌ Không phù hợp |
CloudFront Signed URL có phải S3 presigned URL không?
Không. Đây là 2 cơ chế khác nhau.
| So sánh | CloudFront Signed URL | S3 Presigned URL |
|---|---|---|
| Request đi tới đâu | CloudFront distribution | Amazon S3 trực tiếp |
| Ai verify chữ ký | CloudFront | S3 |
| Mục đích chính | Private content qua CDN | Truy cập tạm thời trực tiếp vào object S3 |
| Có cache/CDN không | ✅ Có | ❌ Không |
| Dùng cho upload trực tiếp | ❌ Thường không | ✅ Rất phổ biến |
Nếu origin là S3 và bạn muốn bắt buộc user đi qua CloudFront, hãy dùng:
- CloudFront Signed URL hoặc Signed Cookies
- OAC để chặn truy cập trực tiếp vào S3 bucket
Khi đó:
- User có quyền → truy cập qua CloudFront
- User không thể bypass CloudFront để gọi thẳng S3 URL
Nguồn AWS chính thức:
- Restrict access to files - Amazon CloudFront
- Decide to use signed URLs or signed cookies - Amazon CloudFront
- Use signed URLs - Amazon CloudFront
- Download and upload objects with presigned URLs - Amazon S3
4. Geo Restriction
5. AWS WAF Integration
6. Field-Level Encryption
Encrypt sensitive fields ngay tại edge:
Invalidation (Xóa cache)
Cách invalidate
Chi phí Invalidation
- 1,000 paths/tháng: FREE
- Sau đó: $0.005/path
Best Practice: Versioning thay vì Invalidation
Real-time Logs & Monitoring
CloudFront Standard Logs (S3)
Log format:
Real-time Logs (Kinesis)
CloudWatch Metrics
Các metrics quan trọng:
Requests- Tổng số requestsBytesDownloaded- Bandwidth4xxErrorRate/5xxErrorRate- Error ratesCacheHitRate- Tỷ lệ cache hit (quan trọng!)
Pricing
Data Transfer Out
| Region | First 10TB | Next 40TB | Next 100TB |
|---|---|---|---|
| US, EU, Canada | $0.085/GB | $0.080/GB | $0.060/GB |
| Asia Pacific | $0.120/GB | $0.100/GB | $0.085/GB |
| South America | $0.170/GB | $0.130/GB | $0.110/GB |
Requests
| Region | HTTP | HTTPS |
|---|---|---|
| US, EU | $0.0075/10K | $0.0100/10K |
| Asia Pacific | $0.0090/10K | $0.0120/10K |
Free Tier
- 1 TB data transfer out/tháng
- 10,000,000 HTTP/HTTPS requests/tháng
- 2,000,000 CloudFront Function invocations/tháng
Data Transfer từ Origin
FREE từ các AWS origins:
- S3 → CloudFront: FREE
- EC2/ALB/ELB → CloudFront: FREE
Price Classes
Có thể giới hạn edge locations để giảm chi phí:
Use Cases phổ biến
1. React/SPA + S3 (Phổ biến nhất!)
Khi build React app:
Cache Strategy quan trọng:
Tại sao index.html không cache?
Upload S3 với Cache Headers:
Khi deploy version mới:
Deploy Script đầy đủ:
CloudFront Behaviors cho React SPA:
| Priority | Path Pattern | Cache Policy | Ghi chú |
|---|---|---|---|
| 0 | /index.html | CachingDisabled | Luôn fresh |
| 1 | /api/* | CachingDisabled | API calls |
| 2 | Default * | CachingOptimized | Static assets |
Xử lý Client-Side Routing (React Router):
Khi user truy cập /about trực tiếp → S3 trả 404 (không có file /about).
Giải pháp với CloudFront Custom Error Response:
Hoặc dùng CloudFront Function:
2. API Acceleration
3. Live & On-Demand Video
4. Multi-Origin Architecture
Best Practices
1. Caching
2. Security
3. Performance
4. Cost Optimization
So sánh với các CDN khác
| Feature | CloudFront | Cloudflare | Fastly |
|---|---|---|---|
| Pricing | Pay-as-you-go | Free tier + plans | Pay-as-you-go |
| Edge Locations | 750+ | 300+ | 80+ |
| Edge Compute | Lambda@Edge, Functions | Workers | Compute@Edge |
| AWS Integration | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐ |
| Free SSL | ✅ (ACM) | ✅ | ✅ |
| DDoS Protection | AWS Shield | ✅ Built-in | ✅ |
| WAF | AWS WAF ($) | ✅ Built-in | ✅ ($) |
| Real-time Logs | ✅ (Kinesis) | ✅ | ✅ |
Khi nào chọn CloudFront:
- Đã dùng AWS ecosystem
- Cần tight integration với S3, ALB, Lambda
- Cần Origin Shield
- Enterprise với AWS support
Kết hợp với Route 53
Troubleshooting
Cache không hoạt động?
403 Forbidden?
502/504 Errors?
AWS Global Accelerator
Global Accelerator là SERVICE RIÊNG của AWS, không phải feature của CloudFront. Cả hai đều dùng AWS Edge Locations nhưng mục đích khác nhau.
📖 Xem chi tiết: AWS Global Accelerator
So sánh nhanh:
| Feature | CloudFront | Global Accelerator |
|---|---|---|
| Layer | Layer 7 (HTTP/HTTPS) | Layer 4 (TCP/UDP) |
| Caching | ✅ Có | ❌ Không |
| Static IP | ❌ Không | ✅ 2 Anycast IPs |
| Use case | Websites, APIs | Gaming, IoT, VoIP |
✅ Exam tip: "static IP", "UDP", "gaming", "non-HTTP" → Global Accelerator