如果你已经用过 AWS S3 托管过静态网站,可能会发现一个问题——当用户从地球另一端访问时,加载速度并不理想。这时候就需要 Amazon CloudFront 登场了。简单来说,如果说 S3 是云端的“硬盘”,那么 CloudFront 就是给这块硬盘配上的一张“全球分发网络”。

今天这篇文章,就带你彻底搞懂 CloudFront 是什么、能解决什么问题,然后手把手完成一次 CDN 分发配置。

什么是 Amazon CloudFront?

CloudFront 是 AWS 提供的内容分发网络(CDN)服务。它的核心任务是将你的网站内容(图片、视频、CSS、JavaScript 等)缓存到全球各地的边缘节点,让用户从离自己最近的地方获取数据,从而大幅降低访问延迟。

CloudFront 的核心优势

  1. 全球覆盖:CloudFront 拥有超过 600 个全球边缘节点,覆盖 90 多个城市,能够将内容快速分发到世界各地的用户。边缘节点通过 AWS 全球网络骨干网互联,确保数据传输的高效与稳定。

  2. 安全防护:CloudFront 与 AWS WAF、AWS Shield 无缝集成,可防御网络层和应用层的 DDoS 攻击。同时,它还支持 HTTPS 加密传输和字段级加密,保障数据安全。

  3. 按量付费:AWS 为新用户提供永久免费的每月 1TB 传出数据和 200 万次 HTTP/HTTPS 请求额度,对个人学习和小型项目非常友好。

  4. 边缘计算能力:通过 CloudFront Functions 和 Lambda@Edge,可以在边缘节点运行代码,实现请求改写、图片处理、A/B 测试等自定义逻辑。

CloudFront 能用来做什么?

CloudFront 的应用场景非常广泛:

  • 静态网站加速:将 S3 中托管的 HTML、CSS、JS、图片等静态资源分发到全球边缘节点,大幅提升加载速度

  • 动态内容加速:优化 API 请求和个性化内容的传输,Slack 使用 CloudFront 后全球 API 平均延迟从 90ms 降至 15ms

  • 视频点播与直播:通过 AWS Media Services 集成,支持高质量的流媒体分发

  • 边缘计算:在边缘节点执行轻量级代码,如 URL 重写、请求头修改、缓存键规范化等

图文教程:创建你的第一个 CloudFront 分发

下面我们从零开始,为一个 S3 静态网站配置 CloudFront CDN。整个过程大约需要 5-10 分钟配置 + 等待分发部署(约 5-15 分钟)。

第一步:准备 S3 源站

在配置 CloudFront 之前,需要先在 S3 中准备好你的网站文件:

  1. 创建一个 S3 存储桶,并上传至少一个 index.html 文件

  2. 记录存储桶的区域域名,格式类似 my-bucket.s3.us-east-1.amazonaws.com

⚠️ 重要提示:CloudFront 访问 S3 时使用 REST API 端点(s3.amazonaws.com),而不是 S3 网站托管端点(s3-website-xxx)。使用错误的端点会导致 OAC 认证失败。

第二步:进入 CloudFront 控制台

登录 AWS 管理控制台,在顶部搜索框输入 “CloudFront” 并点击进入。

第三步:创建分发

点击橙色的 “创建分发” 按钮。

配置源(Origin)

  • 源类型:选择 Amazon S3

  • 源域名:选择你准备好的 S3 存储桶

  • 路径:留空(表示访问根路径)

  • 名称:可自定义,方便识别

配置源访问权限

推荐使用 Origin Access Control(OAC) 来确保只有 CloudFront 能读取 S3 中的内容,而不是让 S3 存储桶公开访问。

  • 选择 “源访问控制(推荐)”

  • 如果已有 OAC 可直接选择,否则点击“创建新的 OAC”,AWS 会自动完成配置

为什么需要 OAC?

如果没有 OAC,你需要将 S3 存储桶设为公开才能让 CloudFront 访问内容,这存在安全风险。OAC 允许 CloudFront 通过服务主体身份安全地访问你的私有 S3 存储桶,同时你可以关闭 S3 的公开访问权限。

配置查看器协议与缓存

  • 查看器协议策略:选择 “将 HTTP 重定向到 HTTPS”(生产环境推荐强制加密)

  • 缓存策略:对于静态网站,推荐使用 AWS 托管策略 “CachingOptimized”,它会自动设置合理的 TTL(默认 TTL 24 小时,最大 TTL 365 天)

  • 压缩对象:建议开启,CloudFront 会自动使用 Brotli 或 Gzip 压缩文本内容(HTML、CSS、JS、JSON),可减少 50%-70% 的文件体积

配置价格等级

CloudFront 提供了三个价格等级,用于控制哪些边缘节点提供服务:

价格等级覆盖范围适用场景Price Class 100北美、欧洲、以色列用户集中在这些区域,成本最低Price Class 200Price Class 100 + 亚洲、非洲、中东用户分布较广Price Class All全球所有边缘节点追求极致全球性能

对于个人项目,Price Class 100 通常已经足够。

配置 SSL/TLS 证书

如果你暂时不使用自定义域名,可以直接使用 CloudFront 提供的默认证书。CloudFront 会为 *.cloudfront.net 域名自动启用 HTTPS,无需额外配置。

如果已有自定义域名(如 www.example.com),则需要先在 AWS Certificate Manager(ACM)中申请证书,并在分发配置中关联。

配置自定义错误响应(SPA 路由支持)

如果你的网站是单页应用(SPA),需要特别配置错误响应,否则直接访问 /about-us 这类路径时会返回 403 或 404 错误。原因是 S3 中并没有 about-us 这个文件,CloudFront 需要将这些路径映射到 index.html

在“错误页面”选项卡中,完成以下配置:

  1. 点击 “创建自定义错误响应”

  2. HTTP 错误码:选择 403: Forbidden

  3. 自定义错误响应:选择 “是”

  4. 响应页面路径:输入 /index.html

  5. HTTP 响应码:选择 200: OK

  6. 重复以上步骤,为 404: Not Found 添加相同的配置

  7. 错误缓存最小 TTL 可设置为 10 秒或 0

第四步:等待部署并测试

点击 “创建分发” 后,CloudFront 会将配置部署到全球边缘节点,状态显示为“正在部署”。

可以使用以下命令等待部署完成:

bash

aws cloudfront wait distribution-deployed --id YOUR_DISTRIBUTION_ID

部署完成后,在分发详情页可以看到 “分发域名”(类似 d12345678.cloudfront.net),在浏览器中访问该地址即可看到你的网站。

第五步:更新 S3 存储桶策略(加强安全)

创建分发后,需要更新 S3 存储桶策略,仅允许 CloudFront 服务主体访问,同时可以重新启用 S3 的“阻止公开访问”设置。

以下是一个策略示例,将 YOUR_DISTRIBUTION_IDYOUR_ACCOUNT_ID 替换为实际值:

json

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

应用策略后,任何对 S3 的直接访问都会被拒绝,只有 CloudFront 能读取内容。

进阶优化技巧

当你掌握了基本配置后,可以尝试以下优化:

1. 差异化缓存策略

对于 SPA 项目,建议对不同资源采用不同缓存策略:

  • index.html:设置短 TTL(如 60 秒),配合 stale-while-revalidate 确保用户在后台更新期间能获得内容

  • 带哈希的 JS/CSS 文件:设置长 TTL(如 1 年),利用 Cache-Control: public, max-age=31536000, immutable

  • 图片资源:设置 24 小时到 7 天的缓存时间

2. 启用 Origin Shield

Origin Shield 是一个位于区域边缘的缓存层,它会整合来自多个边缘节点的回源请求,减少对源站的压力,可降低 60% 以上的回源频率。

3. 使用 Lambda@Edge 做边缘计算

Lambda@Edge 允许在边缘节点运行代码,可实现更复杂的自定义逻辑:

  • 根据用户所在国家/地区返回不同语言的版本

  • 检测浏览器是否支持 WebP,动态转换图片格式

  • 修改或添加响应头

别忘了“打扫房间”

CloudFront 本身收费基于实际用量,但如果你创建的 S3 存储桶和 OAC 资源持续存在,可能会产生费用。测试完成后:

  1. 删除 CloudFront 分发:先禁用分发,待状态变为“已禁用”后再删除

  2. 删除 OAC:在 CloudFront 的“源访问控制”面板中删除

  3. 清空并删除 S3 存储桶


希望这篇教程能帮你将网站接入 CDN,让全球用户都能享受快速访问体验。CloudFront 是 AWS 生态中最成熟的服务之一,掌握它,你的云上架构能力会更上一层楼!