AWS CloudFront:全球内容分发网络
什么是 AWS CloudFront?
AWS CloudFront 是 Amazon 提供的一项快速内容分发网络(CDN)服务。它通过全球分布的边缘节点(Edge Locations)缓存你的静态和动态内容,显著降低访问延迟、提高传输速度,同时为你的应用提供 DDoS 防护和 HTTPS 支持。
CloudFront 可以加速的内容类型包括:
- 网页中常用的静态文件:HTML、CSS、JavaScript、图片、视频
- 动态 API 响应
- 流媒体直播与点播
- 整个 Web 应用
与 S3 的关系:CloudFront 经常和 S3 配合,将 S3 存储桶作为源站(Origin),让用户从最近的边缘节点获取文件,而不是直接请求 S3,从而节省跨区域传输成本并提升性能。
CloudFront 的核心概念
在开始配置之前,你需要理解以下四个关键组件:
1. 分发(Distribution)
CloudFront 的基本工作单元。每个分发相当于一个 CDN 配置实例,它定义了:
- 内容从哪里来(源站)
- 如何在边缘节点上缓存
- 域名、SSL 证书等行为策略
分发分为两类:
- Web 分发:用于静态网站、API、视频流等
- RTMP 分发:已基本弃用,推荐使用 HLS 等基于 HTTP 的流媒体方案
2. 源站(Origin)
你的内容的最终源头,可以是:
- AWS 内部服务:S3 存储桶、MediaStore、MediaPackage、ALB / NLB 等
- 自建源站:运行在 EC2 上的 HTTP 服务器、本地数据中心通过 VPN/Direct Connect 对外暴露的端点
3. 边缘节点(Edge Location)
CloudFront 在全球有 600+ 边缘节点,分布在 90+ 城市。请求会被自动路由到延迟最低的节点。如果节点没有缓存内容,它会从源站拉取、缓存,并返回给用户。
4. 区域性边缘缓存(Regional Edge Cache)
介于源站和边缘节点之间的更大缓存层。当本地边缘节点未命中时,先检查区域边缘缓存,没有才会回源。这减少了向源站发起的请求数,对高并发场景十分关键。
CloudFront 的工作原理
一次典型的用户请求流程如下:
- 用户访问你的 CloudFront 域名(例如
d1234.cloudfront.net或你的自定义域名)。 - DNS 将请求路由到最近的边缘节点。
- 边缘节点检查缓存:
- 命中缓存(Cache Hit):直接返回内容。
- 未命中(Cache Miss):节点向区域边缘缓存请求;如仍未命中,则向源站发起请求。
- 源站返回数据,边缘节点根据配置的缓存策略(Cache Policy)缓存该对象,并交付给用户。
- 后续相同请求直接被边缘节点服务。
动态内容(如 API)可以配置为 不缓存,但 CloudFront 仍能通过优化的 AWS 骨干网络加速从源站到用户的传输。
创建你的第一个 CloudFront 分发
下面以 S3 静态网站为源站,演示如何快速起步。
步骤 1:准备 S3 源站
- 创建一个 S3 存储桶,上传你的网站文件(例如
index.html)。 - 关闭“阻止所有公共访问”,并附加以下存储桶策略(允许 CloudFront 访问):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::你的存储桶名/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::你的账户ID:distribution/分发ID"
}
}
}
]
}
提示:使用 OAC(Origin Access Control)代替老旧的 OAI,更安全且支持 SSE-KMS 加密。
步骤 2:创建 CloudFront Web 分发
- 进入 CloudFront 控制台,点击 创建分发。
- 源站域名:选择你的 S3 存储桶(列表会自动加载)。
- 源站访问:选择“源站访问控制设置”,推荐使用 OAC,并让 CloudFront 自动更新 S3 存储桶策略。
- 查看器协议策略:选择“Redirect HTTP to HTTPS”,强制 HTTPS。
- 允许的 HTTP 方法:若仅提供静态网站,选择 GET、HEAD;若涉及 API 则需 POST、PUT 等。
- 缓存策略:可以选用预设的 Managed-CachingOptimized(适用于大多数静态内容)或 Managed-CachingDisabled(完全禁用缓存)。
- Web 应用程序防火墙 (WAF):根据需要可启用 AWS WAF 防护。
- 价格等级:选择“仅使用北美、欧洲、亚洲、中东和非洲”可控制成本。
- 备用域名 (CNAME):如果你有自定义域名,在此添加,并需在 Route 53 或外部 DNS 配置别名记录或 CNAME。
- SSL 证书:若使用自定义域名,需通过 ACM 申请证书(必须位于 us-east-1 区域)。
- 其他设置默认,点击 创建分发。
步骤 3:测试与验证
- 分发部署需要 5-15 分钟,状态变为“已部署”后,访问分配的 CloudFront 域名(如
d123.cloudfront.net)。 - 检查响应头中是否包含
x-cache: Hit from cloudfront,说明已命中缓存。
缓存与失效策略
控制缓存时间
CloudFront 的缓存行为遵循以下优先级(从高到低):
- 源站响应的
Cache-Control: max-age或Expires头 - 分发中配置的缓存策略(最小、最大 TTL,以及默认 TTL)
- 若均未指定,默认 TTL 为 24 小时
常用缓存策略示例:
- 静态资源:设置
max-age=31536000(一年),并配合文件版本化(如style.v2.css)实现及时更新。 - HTML 入口页:设置短缓存或不缓存(
max-age=0,配合must-revalidate)。
缓存失效(Invalidation)
当源站内容更新,但你希望用户立即获取最新版本时,可以创建失效请求,手动清除边缘节点缓存。控制台支持按路径失效,例如:
/*清空全部分发内容(尽量少用,可能产生费用)/images/*只清除图片目录
每月前 1,000 条失效路径免费,超出后按每条收费。
自定义域名与 HTTPS
绑定自定义域名
- 在 CloudFront 分发的 备用域名 处添加你的域名(如
www.example.com)。 - 在 DNS 提供商(如 Route 53)创建记录:
- 若是 Route 53,可选择别名记录指向 CloudFront 分发域名。
- 其他 DNS:创建 CNAME 记录,但需要注意根域名(example.com)无法使用 CNAME,此时需用 Route 53 的别名或 CloudFront 的备用域名配合 ALB。
- 在 ACM(us-east-1区)申请或导入证书,覆盖你的自定义域名,然后在 CloudFront 分发的 SSL 证书设置中选中该证书。
强制 HTTPS 与 HTTP/2
- 查看器协议策略建议设为“Redirect HTTP to HTTPS”。
- CloudFront 默认支持 HTTP/2 和 HTTP/3(QUIC),无需额外配置,能进一步提升加载速度。
保护你的内容
签名 URL 与签名 Cookie
对于付费或私有内容,可以启用 CloudFront 的 受信任的密钥组 或 AWS 账户根密钥 来生成签名 URL 或签名 Cookie,只允许持有有效签名的请求访问。
典型流程:
- 在 CloudFront 分配的行为设置中,将“限制查看者访问”设为“是”。
- 创建一个密钥组,并生成公钥/私钥对。
- 在你的后端应用中,用私钥生成有时效性的签名 URL,返回给授权用户。
防止直接访问 S3
使用 OAC 后,即使有人知道了 S3 原始端点,也无法直接下载文件,因为桶策略只允许 CloudFront 获取对象。
日志、监控与成本优化
访问日志
可启用标准日志记录或实时日志。标准日志会将每个请求的详细信息存储到你指定的 S3 存储桶中。日志字段包括请求时间、边缘节点 IP、缓存状态、字节数等。通过 Athena 可对日志进行 SQL 查询。
监控指标
在 CloudFront 控制台或 CloudWatch 中,可查看:
- 总请求数、HTTP 错误率
- 缓存命中率
- 数据传输量(按区域细分)
设置 CloudWatch 告警,当 4xx / 5xx 错误率异常或请求量激增时通知你。
降低成本的技巧
- 合理使用价格等级:排除掉边缘节点费用较高的区域(如南美、澳大利亚),如果目标用户主要在某一大洲。
- 提高缓存命中率:延长静态资源 TTL,减少回源请求。
- Origin Shield:在 CloudFront 中启用中央缓存层,专门用于合并回源请求,进一步减少对 S3 等源站的请求数。
- 压缩:在分发行为中启用“自动压缩对象”,对文本、JSON 等压缩,减少传出带宽。
常见问题与排错
问题:修改 S3 文件后,CloudFront 仍然显示旧版本
- 等待 TTL 过期,或发起缓存失效。
- 确保文件未在浏览器端被强缓存,检查响应头中的
Cache-Control是否设置过长。建议对 HTML 入口使用较短的缓存,引用资源使用版本化 URL。
问题:CloudFront 返回 403 禁止访问
- 检查 S3 存储桶策略是否正确授予 CloudFront OAC 访问。
- 检查对象是否已上传,并且对象 URL 与请求路径匹配。
- 如果启用了 WAF,检查 WAF 规则是否误拦。
问题:自定义域名 HTTPS 不生效
- 确保证书已在 us-east-1 区域(即使分发在其他区域)。
- 证书需包含备用域名列表中的域名。
- DNS 记录必须指向 CloudFront 分发域名。
总结
AWS CloudFront 为你提供了简单易用、弹性扩展的全球 CDN 服务。从托管静态网站到加速整站动态内容,它都能胜任。通过本教程,你已经了解了:
- CloudFront 的基础术语和工作原理
- 如何创建一个连接 S3 的 Web 分发
- 缓存控制与失效管理的实践
- 自定义域名及安全加固方法
- 监控、日志和成本优化的关键点
下一步,你可以尝试将现有应用接入 CloudFront,并通过调整缓存策略、启用 Origin Shield 和分析日志来持续优化性能。欢迎随时参考官方文档深入了解 Lambda@Edge 函数、实时日志等高级功能。