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
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