📋 Table of Contents
🔍 Amazon CloudFront Overview
Amazon CloudFront is a content delivery network (CDN) service that delivers data, videos, applications, and APIs to customers globally with low latency and high transfer speeds. It integrates with other AWS services and provides a developer-friendly environment.
Key Features:
- Global Edge Network: 400+ edge locations across 90+ cities
- Real-time Metrics: Detailed analytics and monitoring
- Security: DDoS protection, SSL/TLS encryption, AWS WAF integration
- Performance: Smart routing, compression, HTTP/2 support
- Scalability: Automatic scaling based on demand
🏗️ CloudFront Global Architecture
DNS Resolution} DNS --> Edge[🌐 CloudFront Edge Location] Edge --> Regional[🏢 Regional Edge Cache] Regional --> Origin[🎯 Origin Server] subgraph "Global Edge Network" Edge1[🌐 US East Edge] Edge2[🌐 EU West Edge] Edge3[🌐 Asia Pacific Edge] Edge4[🌐 South America Edge] end subgraph "Regional Caches" RC1[🏢 US Regional Cache] RC2[🏢 EU Regional Cache] RC3[🏢 APAC Regional Cache] end subgraph "Origin Options" S3[📦 S3 Bucket] ALB[⚖️ Application Load Balancer] EC2[💻 EC2 Instance] Custom[🔧 Custom HTTP Origin] end Edge1 --> RC1 Edge2 --> RC2 Edge3 --> RC3 Edge4 --> RC1 RC1 --> S3 RC1 --> ALB RC2 --> EC2 RC3 --> Custom classDef userClass fill:#e1f5fe,stroke:#01579b,stroke-width:3px classDef edgeClass fill:#fff3e0,stroke:#e65100,stroke-width:2px classDef regionalClass fill:#f3e5f5,stroke:#4a148c,stroke-width:2px classDef originClass fill:#e8f5e8,stroke:#1b5e20,stroke-width:2px classDef dnsClass fill:#fff8e1,stroke:#ff8f00,stroke-width:2px class User userClass class DNS dnsClass class Edge,Edge1,Edge2,Edge3,Edge4 edgeClass class Regional,RC1,RC2,RC3 regionalClass class Origin,S3,ALB,EC2,Custom originClass
🔍 Global Architecture Explanation
This diagram illustrates CloudFront's global distribution architecture:
- DNS Resolution: Route 53 directs users to the nearest edge location based on latency
- Edge Locations: 400+ points of presence worldwide that cache content closest to users
- Regional Edge Caches: Intermediate caching layer between edge locations and origins
- Origin Servers: Source of your content (S3, EC2, Load Balancers, or custom servers)
- Traffic Flow: User → DNS → Edge → Regional Cache → Origin (if cache miss)
🚦 Traffic Flow Patterns
Cache Hit Scenario
🎯 Cache Hit Flow Explanation
Optimal performance scenario:
- Step 1: User requests content from CloudFront distribution
- Step 2: Edge location checks local cache and finds content
- Result: Content served directly from edge with minimal latency (10-50ms)
- Benefits: Reduced origin load, faster response times, lower costs
Cache Miss Scenario
⚡ Cache Miss Flow Explanation
First-time or expired content request:
- Step 1: User requests content not in edge cache
- Step 2: Edge location checks regional cache first
- Step 3a: If regional cache has content, it's returned (faster than origin)
- Step 3b-5: If regional cache also misses, request goes to origin
- Step 6: Content returned to user and cached at both levels
- Future requests: Will be cache hits with faster response times
🔄 Cache Behavior and Invalidation
Match?} PathMatch -->|Yes| Behavior[Cache Behavior Rules] PathMatch -->|No| Default[Default Behavior] Behavior --> TTL{TTL Settings} Default --> TTL TTL --> Cache[💾 Cache Content] Cache --> Serve[📤 Serve to User] subgraph "Cache Behavior Options" TTL --> MinTTL[Min TTL: 0s] TTL --> MaxTTL[Max TTL: 31536000s] TTL --> DefaultTTL[Default TTL: 86400s] end subgraph "Invalidation Process" Invalid[🔄 Create Invalidation] Invalid --> Paths[Specify Paths/*] Paths --> Clear[Clear Edge Caches] Clear --> Fresh[Fresh Content Fetch] end Cache -.-> Invalid classDef requestClass fill:#e3f2fd,stroke:#0277bd classDef behaviorClass fill:#f3e5f5,stroke:#7b1fa2 classDef cacheClass fill:#e8f5e8,stroke:#388e3c classDef invalidClass fill:#fff3e0,stroke:#f57c00 class Request requestClass class PathMatch,Behavior,Default behaviorClass class TTL,Cache,Serve,MinTTL,MaxTTL,DefaultTTL cacheClass class Invalid,Paths,Clear,Fresh invalidClass
🎛️ Cache Behavior Configuration
How CloudFront determines caching behavior:
- Path Pattern Matching: Different cache rules for different URL patterns
- TTL Settings: Control how long content stays cached
- Default Behavior: Fallback rules for unmatched patterns
- Invalidation: Force refresh of cached content before TTL expires
- Cache Headers: Origin can control caching with HTTP headers
⚡ CloudFront Setup Command Flow
📋 Setup Flow Explanation
Recommended sequence for CloudFront deployment:
- Steps 1-3: Prepare origin content in S3 bucket
- Step 4: Create Origin Access Control for secure S3 access
- Steps 5-6: Create and configure CloudFront distribution
- Steps 7-8: Set up SSL/TLS and deploy
- Steps 9-11: Configure DNS, test, and monitor
- Optional: Add security (WAF), serverless compute (Lambda@Edge), and logging
💻 AWS CLI Commands & Configuration
🔧 Command Execution Order
1️⃣ Create S3 Bucket (Origin Setup)
aws s3 mb s3://my-cloudfront-origin-bucket \
--region us-east-1
📋 S3 Bucket Creation Parameters
s3://my-cloudfront-origin-bucket- Globally unique bucket name--region us-east-1- AWS region (us-east-1 recommended for CloudFront)
Note: S3 bucket serves as the origin server for CloudFront. Choose us-east-1 for optimal CloudFront integration and lower costs.
2️⃣ Configure S3 Bucket Policy
cat > bucket-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-cloudfront-origin-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::ACCOUNT-ID:distribution/DISTRIBUTION-ID"
}
}
}
]
}
EOF
🔐 S3 Bucket Policy Parameters
Principal.Service- Allows CloudFront service to access bucketAction: s3:GetObject- Grants read-only access to objectsResource- Specifies bucket and all objects within itCondition.StringEquals- Restricts access to specific CloudFront distribution
Security Note: This policy uses Origin Access Control (OAC) to secure S3 access. Replace ACCOUNT-ID and DISTRIBUTION-ID with actual values after creating the distribution.
3️⃣ Upload Content to S3
aws s3 sync ./website-content/ s3://my-cloudfront-origin-bucket/ \
--exclude "*.DS_Store" \
--exclude "*.git/*" \
--cache-control "max-age=86400" \
--content-encoding gzip
📤 S3 Content Upload Parameters
sync- Synchronizes local directory with S3 bucket--exclude- Skips unwanted files (system files, git)--cache-control- Sets HTTP cache headers (86400 = 24 hours)--content-encoding gzip- Enables compression for faster delivery
Performance Tip: Use appropriate cache-control headers for different content types. Static assets (CSS, JS, images) can have longer cache times.
4️⃣ Create Origin Access Control (OAC)
aws cloudfront create-origin-access-control \
--origin-access-control-config '{
"Name": "my-s3-oac",
"Description": "OAC for S3 bucket access",
"OriginAccessControlOriginType": "s3",
"SigningBehavior": "always",
"SigningProtocol": "sigv4"
}'
🛡️ Origin Access Control Parameters
Name- Unique identifier for the OACOriginAccessControlOriginType- Type of origin (s3, mediastore)SigningBehavior- When to sign requests (always, never, no-override)SigningProtocol- AWS signature version (sigv4 recommended)
Security: OAC replaces the legacy Origin Access Identity (OAI) and provides better security for S3 origins. It uses AWS Signature Version 4 for authentication.
5️⃣ Request SSL Certificate (Optional but Recommended)
aws acm request-certificate \
--domain-name "example.com" \
--subject-alternative-names "*.example.com" \
--validation-method DNS \
--region us-east-1
🔒 SSL Certificate Parameters
--domain-name- Primary domain for the certificate--subject-alternative-names- Additional domains (wildcards supported)--validation-method- How AWS validates domain ownership (DNS/EMAIL)--region us-east-1- Must be us-east-1 for CloudFront certificates
Important: ACM certificates for CloudFront must be requested in us-east-1 region. DNS validation is recommended for automation.
6️⃣ Create CloudFront Distribution Configuration
cat > distribution-config.json << 'EOF'
{
"CallerReference": "my-distribution-2024-001",
"Comment": "Production website CDN",
"Enabled": true,
"Origins": {
"Quantity": 1,
"Items": [
{
"Id": "S3-my-cloudfront-origin-bucket",
"DomainName": "my-cloudfront-origin-bucket.s3.us-east-1.amazonaws.com",
"S3OriginConfig": {
"OriginAccessIdentity": ""
},
"OriginAccessControlId": "ORIGIN-ACCESS-CONTROL-ID"
}
]
},
"DefaultCacheBehavior": {
"TargetOriginId": "S3-my-cloudfront-origin-bucket",
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "4135ea2d-6df8-44a3-9df3-4b5a84be39ad",
"OriginRequestPolicyId": "88a5eaf4-2fd4-4709-b370-b4c650ea3fcf",
"Compress": true
},
"PriceClass": "PriceClass_100"
}
EOF
🏗️ CloudFront Distribution Configuration
CallerReference- Unique identifier to prevent duplicate distributionsOrigins- Configuration for content origin serversOriginAccessControlId- Links to OAC created in step 4ViewerProtocolPolicy- Enforces HTTPS (redirect-to-https/https-only)CachePolicyId- Managed caching policy (Managed-CachingOptimized)PriceClass- Geographic distribution scope (affects cost)
Configuration Notes: Replace ORIGIN-ACCESS-CONTROL-ID with the ID from step 4. PriceClass_100 uses only North America and Europe edge locations.
7️⃣ Create CloudFront Distribution
aws cloudfront create-distribution \
--distribution-config file://distribution-config.json \
--output table \
--query 'Distribution.{Id:Id,DomainName:DomainName,Status:Status}'
🚀 Distribution Creation Parameters
--distribution-config- References the JSON configuration file--output table- Formats output as a readable table--query- Filters output to show only essential information
Deployment Time: Distribution creation takes 15-20 minutes. Status will change from "InProgress" to "Deployed". Note the Domain Name for DNS configuration.
8️⃣ Update S3 Bucket Policy with Distribution ID
aws s3api put-bucket-policy \
--bucket my-cloudfront-origin-bucket \
--policy file://bucket-policy.json
🔗 Bucket Policy Application
--bucket- Target S3 bucket name--policy- References the policy JSON file from step 2
Security: Update the bucket-policy.json file with the actual distribution ID before applying. This creates a secure link between CloudFront and S3.
9️⃣ Configure Custom Domain (Optional)
aws cloudfront update-distribution \
--id DISTRIBUTION-ID \
--distribution-config '{
"CallerReference": "my-distribution-2024-001",
"Aliases": {
"Quantity": 1,
"Items": ["www.example.com"]
},
"ViewerCertificate": {
"ACMCertificateArn": "arn:aws:acm:us-east-1:ACCOUNT:certificate/CERT-ID",
"SSLSupportMethod": "sni-only",
"MinimumProtocolVersion": "TLSv1.2_2021"
}
}'
🌐 Custom Domain Configuration
Aliases- Custom domain names for the distributionACMCertificateArn- SSL certificate ARN from step 5SSLSupportMethod- SNI-only (recommended) or dedicated IPMinimumProtocolVersion- Minimum TLS version for security
DNS Setup: After updating, create a CNAME record pointing your domain to the CloudFront distribution domain name.
🔟 Create Route 53 DNS Record
aws route53 change-resource-record-sets \
--hosted-zone-id Z1D633PJN98FT9 \
--change-batch '{
"Changes": [{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": "www.example.com",
"Type": "CNAME",
"TTL": 300,
"ResourceRecords": [{"Value": "d1234567890123.cloudfront.net"}]
}
}]
}'
🔗 DNS Record Parameters
--hosted-zone-id- Route 53 hosted zone ID for your domainAction: CREATE- Creates a new DNS recordType: CNAME- Points domain to CloudFront distributionTTL: 300- DNS cache time (5 minutes)
Alternative: Use an A record with alias target for apex domains (example.com). CNAME records are for subdomains (www.example.com).
1️⃣1️⃣ Enable CloudWatch Monitoring
aws cloudfront put-monitoring-subscription \
--distribution-id DISTRIBUTION-ID \
--monitoring-subscription '{
"RealtimeMetricsSubscriptionConfig": {
"RealtimeMetricsSubscriptionStatus": "Enabled"
}
}'
📊 Monitoring Configuration
RealtimeMetricsSubscriptionStatus- Enables real-time metrics- Additional costs apply - Real-time metrics are a premium feature
Monitoring Benefits: Real-time metrics provide detailed insights into cache hit ratios, error rates, and geographic distribution of requests.
🔧 Advanced Configuration Examples
Cache Behaviors for Different Content Types
{
"CacheBehaviors": {
"Quantity": 3,
"Items": [
{
"PathPattern": "/api/*",
"TargetOriginId": "API-Origin",
"ViewerProtocolPolicy": "https-only",
"CachePolicyId": "4135ea2d-6df8-44a3-9df3-4b5a84be39ad",
"TTL": 0,
"ForwardedValues": {
"QueryString": true,
"Headers": {
"Quantity": 2,
"Items": ["Authorization", "Content-Type"]
}
}
},
{
"PathPattern": "/images/*",
"TargetOriginId": "S3-Images",
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"TTL": 31536000,
"Compress": true
},
{
"PathPattern": "*.css",
"TargetOriginId": "S3-Assets",
"ViewerProtocolPolicy": "redirect-to-https",
"CachePolicyId": "658327ea-f89d-4fab-a63d-7e88639e58f6",
"TTL": 2592000,
"Compress": true
}
]
}
}
🎯 Advanced Cache Behavior Configuration
- /api/* pattern: No caching (TTL: 0) for dynamic API responses
- /images/* pattern: Long cache time (1 year) for static images
- *.css pattern: Medium cache time (30 days) for stylesheets
- Compression: Enabled for text-based content to reduce bandwidth
- Headers forwarding: Forward authentication headers for API requests
Lambda@Edge Function for Custom Headers
aws lambda create-function \
--function-name cloudfront-security-headers \
--runtime nodejs18.x \
--role arn:aws:iam::ACCOUNT:role/lambda-edge-role \
--handler index.handler \
--zip-file fileb://function.zip \
--region us-east-1 \
--timeout 5 \
--memory-size 128
⚡ Lambda@Edge Configuration
--runtime nodejs18.x- Latest supported Node.js runtime--region us-east-1- Lambda@Edge functions must be in us-east-1--timeout 5- Maximum 5 seconds for viewer-response events--memory-size 128- Minimum memory allocation
Use Cases: Security headers, A/B testing, request/response modification, authentication, and personalization at the edge.
Invalidation for Content Updates
aws cloudfront create-invalidation \
--distribution-id DISTRIBUTION-ID \
--paths "/*" "/images/logo.png" "/css/main.css" \
--caller-reference "invalidation-$(date +%s)"
🔄 Cache Invalidation Parameters
--paths- Specific files or patterns to invalidate"/*"- Invalidates all cached content (use carefully)--caller-reference- Unique identifier using timestamp
Cost Consideration: First 1,000 invalidation requests per month are free. Use versioned filenames to avoid frequent invalidations.
🚨 Best Practices Summary
- Security: Always use HTTPS and Origin Access Control
- Performance: Set appropriate TTL values for different content types
- Cost Optimization: Use price classes and monitoring to control costs
- Monitoring: Enable CloudWatch metrics and set up alarms
- Updates: Use versioned assets instead of frequent invalidations