AWS S3 + CloudFront 搭建全球加速静态网站完整教程(2026最新版)

📅 · AWS 国际版实战教程 - ChengziCloud

一句话结论

Meta Description: AWS S3静态网站托管搭配CloudFront CDN全球加速实战:从S3桶创建到CloudFront分发、自定义域名HTTPS、缓存策略优化,完整操作步骤+价格对比表格+常见问题FAQ。

本文要点
  • 前言
  • S3 + CloudFront 架构全景
  • 步骤一:创建 S3 存储桶并开启静态网站托管
  • 步骤二:通过 AWS Certificate Manager 申请免费 SSL 证书
  • 步骤三:创建 CloudFront 分发
  • 步骤四:配置 Route 53 DNS 指向 CloudFront
  • 步骤五:自动部署与缓存失效
  • 步骤六:成本分析与省钱技巧

Meta Description: AWS S3静态网站托管搭配CloudFront CDN全球加速实战:从S3桶创建到CloudFront分发、自定义域名HTTPS、缓存策略优化,完整操作步骤+价格对比表格+常见问题FAQ。

关键词:AWS S3静态网站、CloudFront CDN加速、S3网站托管、AWS全球加速、CloudFront分发、静态网站部署、S3+CloudFront教程

前言

想部署一个高可用、全球低延迟的静态网站,但又不想管理服务器?AWS S3 + CloudFront 组合是最经典的解决方案。S3 提供近乎无限的存储和 99.999999999%(11个9)的数据持久性,CloudFront 通过全球 600+ 边缘节点将内容缓存到离用户最近的位置。本教程带你从零搭建一个生产级的全球加速静态网站,涵盖控制台操作、CLI命令、缓存策略和成本优化。

S3 + CloudFront 架构全景

在动手之前,先理解整体架构:


用户请求 → Route 53 DNS → CloudFront CDN → S3 Bucket(源站)
                ↓                            ↓
         ACM SSL 证书                   静态文件(HTML/CSS/JS/图片)
组件作用计费方式
S3存储静态文件(HTML、CSS、JS、图片)按存储量 + 请求次数
CloudFront全球CDN分发,边缘缓存加速按数据传输量 + 请求次数
Route 53DNS解析,域名指向CloudFront按托管区 + 查询次数
ACM免费SSL/TLS证书,绑定CloudFront免费

步骤一:创建 S3 存储桶并开启静态网站托管

1.1 通过 AWS 控制台创建 S3 桶

  1. 登录 AWS Management Console
  2. 点击 创建存储桶(Create bucket)
  3. 填写配置:
配置项推荐值说明
桶名称www.yourdomain.com必须与域名一致(用于静态托管)
AWS 区域us-east-1(北弗吉尼亚)CloudFront 源站免数据传输费
阻止公共访问取消勾选静态网站需要公开读取
存储桶版本控制启用方便回滚
  1. 点击「创建存储桶」

1.2 开启静态网站托管

进入 S3 桶 → 属性(Properties) → 最底部 静态网站托管(Static website hosting):

  • 选择「启用」
  • 托管类型:托管静态网站
  • 索引文档:index.html
  • 错误文档:error.html(可选)
  • 点击「保存更改」

1.3 设置存储桶策略(允许公开读取)

进入 权限(Permissions) → 存储桶策略(Bucket policy),粘贴:


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::www.yourdomain.com/*"
    }
  ]
}

⚠️ 将 www.yourdomain.com 替换为你的桶名称。

1.4 上传静态文件

点击 对象(Objects) → 上传(Upload),将你的 HTML/CSS/JS/图片文件上传。

或用 AWS CLI 一键同步:


# 安装AWS CLI后配置
aws configure

# 同步本地构建目录到S3
aws s3 sync ./dist/ s3://www.yourdomain.com/ \
  --delete \
  --cache-control "max-age=31536000,public"

# 对HTML文件设置不同缓存策略
aws s3 cp ./dist/index.html s3://www.yourdomain.com/index.html \
  --cache-control "max-age=0,no-cache,must-revalidate"

上传完成后,S3 会提供一个静态网站终端节点 URL: http://www.yourdomain.com.s3-website-us-east-1.amazonaws.com

步骤二:通过 AWS Certificate Manager 申请免费 SSL 证书

重要:CloudFront 使用的证书必须在 us-east-1(北弗吉尼亚)区域申请!

  1. 切换到 us-east-1 区域
  2. 进入 ACM 控制台
  3. 点击 请求证书(Request certificate) → 请求公有证书
  4. 填写域名:
  • yourdomain.com
  • *.yourdomain.com(通配符,覆盖所有子域名)
  1. 验证方法选择 DNS 验证(推荐,可自动续期)
  2. 在 Route 53 中点击「创建记录」自动添加验证记录
  3. 等待验证通过(通常 1-5 分钟)

步骤三:创建 CloudFront 分发

3.1 创建分发配置

  1. 进入 CloudFront 控制台
  2. 点击 创建分发(Create Distribution)
配置项推荐值说明
源站域名www.yourdomain.com.s3-website-us-east-1.amazonaws.com不要选下拉自动补全的S3桶,手动输入静态托管域名
查看器协议策略Redirect HTTP to HTTPS强制 HTTPS
允许的 HTTP 方法GET, HEAD静态网站仅需这两个
缓存策略CachingOptimized(托管策略)或自定义策略
价格等级使用所有边缘节点(全部)最佳性能
备用域名(CNAME)www.yourdomain.com, yourdomain.com自定义域名
SSL 证书选择 ACM 中申请的证书必须 us-east-1 区域
默认根对象index.html首页文件

3.2 🔴 关键配置:Origin Domain 不要选自动补全

AWS 控制台在下拉框中会自动列出 S3 桶名,但不要选择。选自动补全的桶时 CloudFront 使用 S3 REST API 端点而非静态网站托管端点,会导致:

  • 无法设置默认索引文档
  • 子路径访问返回 403(如 /about/ 无法自动加载 /about/index.html)
  • 错误页面配置失效

正确的做法是:手动粘贴 S3 静态网站托管终端节点 URL。

3.3 缓存策略优化

创建自定义缓存策略(推荐用于生产环境):


{
  "minTTL": 0,
  "defaultTTL": 86400,
  "maxTTL": 31536000,
  "queryString": false,
  "cookie": false,
  "header": ["Origin", "Access-Control-Request-Method", "Access-Control-Request-Headers"],
  "compression": true
}
文件类型建议 TTL原因
*.html0-300秒内容更新频繁,需及时刷新
.css, .js30天使用版本号/哈希命名,永久缓存
.png, .jpg, *.svg180天静态资源极少变动
.woff2, .ttf365天字体文件几乎从不变化

步骤四:配置 Route 53 DNS 指向 CloudFront

  1. 进入 Route 53 控制台
  2. 选择你的托管区域 → 创建记录
  3. 配置:
记录类型记录名称值/流量路由
A(IPv4)yourdomain.com别名 → CloudFront 分发域名
AAAA(IPv6)yourdomain.com别名 → CloudFront 分发域名
A(IPv4)www.yourdomain.com别名 → CloudFront 分发域名
CNAME*(可选)别名 → CloudFront 分发域名

Route 53 的别名记录不收费,且支持裸域(apex domain)指向 CloudFront。

等待 DNS 传播(通常 1-10 分钟),用 dig yourdomain.com 验证解析是否指向 CloudFront IP。

步骤五:自动部署与缓存失效

5.1 一键部署脚本


#!/bin/bash
# deploy.sh — S3 + CloudFront 自动化部署脚本
BUCKET="www.yourdomain.com"
DIST_ID="E1ABCDEFGHIJKL"  # CloudFront 分发ID
BUILD_DIR="./dist"

echo "▶ 上传文件到 S3..."
aws s3 sync "$BUILD_DIR/" "s3://$BUCKET/" \
  --delete \
  --exclude "*.html" \
  --cache-control "max-age=31536000,public"

# HTML 文件使用短缓存
aws s3 sync "$BUILD_DIR/" "s3://$BUCKET/" \
  --delete \
  --exclude "*" \
  --include "*.html" \
  --cache-control "max-age=0,no-cache,must-revalidate"

echo "▶ 刷新 CloudFront 缓存..."
aws cloudfront create-invalidation \
  --distribution-id "$DIST_ID" \
  --paths "/*"

echo "✔ 部署完成!"

5.2 GitHub Actions 持续部署


# .github/workflows/deploy.yml
name: Deploy to S3 + CloudFront
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci && npm run build
      - uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: us-east-1
      - run: |
          aws s3 sync ./dist/ s3://www.yourdomain.com/ --delete \
            --cache-control "max-age=31536000,public"
          aws s3 cp ./dist/index.html s3://www.yourdomain.com/index.html \
            --cache-control "max-age=0,no-cache,must-revalidate"
          aws cloudfront create-invalidation \
            --distribution-id ${{ secrets.CLOUDFRONT_DIST_ID }} \
            --paths "/*"

步骤六:成本分析与省钱技巧

S3 存储费用(us-east-1,截至 2026年)

存储量标准存储费用智能分层费用
首个 50 TB$0.023/GB/月$0.023/GB/月 + 监控费
50-500 TB$0.022/GB/月自动优化
500 TB+$0.021/GB/月自动优化

CloudFront 数据传输费用(按区域)

区域前 10 TB10-50 TB50-150 TB
美国/加拿大$0.085/GB$0.080/GB$0.060/GB
欧洲$0.085/GB$0.080/GB$0.060/GB
亚太(香港/新加坡)$0.120/GB$0.100/GB$0.090/GB
亚太(印度)$0.170/GB$0.130/GB$0.110/GB
南美$0.250/GB$0.200/GB$0.150/GB

月度成本估算对比

规模S3 存储量月流量月费用(估算)对比传统 VPS
小型个人站1 GB50 GB$1-2$5 VPS
中型企业站10 GB500 GB$15-25$20-40 VPS
大型内容站100 GB5 TB$70-120$100-200+ 服务器
超大型1 TB50 TB$500-800$1000+ CDN

💡 10个省钱技巧

  1. CloudFront 源站选 us-east-1:S3 → CloudFront(同区域)免数据传输费
  2. 开启 S3 智能分层:访问模式不固定时自动降冷,省 40-60% 存储费
  3. CloudFront 价格等级选「北美+欧洲」:如果用户集中在欧美,省 30-50%
  4. 启用 Gzip/Brotli 压缩:CloudFront 自动压缩文本文件,减少 60-80% 流量
  5. 合理设置 TTL:长缓存减少回源请求(S3 GET 按次收费)
  6. S3 生命周期策略:旧版本 30 天后自动删除
  7. CloudFront 预留容量:承诺月度最低消费可享 15-20% 折扣
  8. 使用 AWS Budgets 设置告警:月度费用超 $10/$50/$100 自动发邮件提醒
  9. CloudFront 日志:仅排查问题时开启,避免 S3 日志存储费累积
  10. AWS 免费套餐:新用户前 12 个月每月 5GB S3 标准存储 + 20,000 GET 请求免费

S3 + CloudFront 静态网站 vs 其他方案对比

维度S3 + CloudFrontAWS LightsailVPS(传统)Vercel / Netlify
起步费用$0(免费套餐)$3.5/月$5/月$0(免费套餐)
自动扩缩✅ 无限制❌ 需升级套餐❌ 手动扩容✅ 无限制
全球加速✅ 600+节点❌ 单一区域❌ 需要额外CDN✅ 内置CDN
HTTPS✅ ACM 免费✅ 免费需手动配置✅ 自动
自定义域名✅✅✅✅
后端逻辑❌ 纯静态✅ 支持✅ 支持❌ 纯静态/Serverless
API支持❌ 需配合Lambda❌ 需自行搭建✅✅ Serverless函数
运维复杂度低中高极低
适合场景官网/博客/文档站小型全栈应用全栈应用前端/Jamstack项目

AWS CLI 常用命令速查


# ============ S3 ============
# 列出所有桶
aws s3 ls

# 列出桶内文件
aws s3 ls s3://www.yourdomain.com/ --recursive --human-readable

# 上传单个文件
aws s3 cp index.html s3://www.yourdomain.com/ --cache-control "max-age=0"

# 同步目录(增量上传)
aws s3 sync ./dist/ s3://www.yourdomain.com/ --delete --dryrun

# 查看桶策略
aws s3api get-bucket-policy --bucket www.yourdomain.com

# 启用静态网站托管
aws s3 website s3://www.yourdomain.com/ \
  --index-document index.html \
  --error-document error.html

# ============ CloudFront ============
# 列出所有分发
aws cloudfront list-distributions --query "Distributions[*].{Id:Id,Domain:DomainName,Status:Status}"

# 获取分发详细配置
aws cloudfront get-distribution --id E1ABCDEFGHIJKL

# 创建缓存失效
aws cloudfront create-invalidation \
  --distribution-id E1ABCDEFGHIJKL \
  --paths "/index.html" "/assets/*"

# 查看失效状态
aws cloudfront list-invalidations --distribution-id E1ABCDEFGHIJKL --max-items 5

# 查看分发实时指标
aws cloudwatch get-metric-statistics \
  --namespace AWS/CloudFront \
  --metric-name Requests \
  --dimensions Name=DistributionId,Value=E1ABCDEFGHIJKL Name=Region,Value=Global \
  --start-time 2026-07-26T00:00:00Z \
  --end-time 2026-08-02T00:00:00Z \
  --period 86400 \
  --statistics Sum

故障排查指南

问题1:访问 CloudFront 域名返回 403

原因:S3 桶策略未允许公开读取,或未使用 S3 静态网站托管终端节点。

排查:


# 1. 直接访问 S3 静态托管端点验证
curl -I http://www.yourdomain.com.s3-website-us-east-1.amazonaws.com/

# 2. 检查 CloudFront 源站配置
aws cloudfront get-distribution --id E1ABCDEFGHIJKL \
  --query "Distribution.DistributionConfig.Origins.Items[0].DomainName"
# 输出必须包含 "s3-website" 而非 "s3.amazonaws.com"

问题2:更新文件后 CloudFront 仍返回旧内容

原因:CloudFront 缓存未失效,边缘节点仍持有旧版本。

解决:


# 创建失效请求(免费额度:每月 1000 个路径)
aws cloudfront create-invalidation --distribution-id E1ABCDEFGHIJKL --paths "/*"

# 或用通配符指定具体路径
aws cloudfront create-invalidation --distribution-id E1ABCDEFGHIJKL --paths "/index.html" "/assets/*"

问题3:子路径路由失效(Vue/React SPA)

原因:SPA 路由由前端 JS 处理,但 CloudFront/S3 不知道 /about 应返回 index.html。

解决:在 CloudFront 分发 → 错误页面 → 创建自定义错误响应:

HTTP 错误码响应页面路径HTTP 响应码
403/index.html200
404/index.html200

问题4:CORS 跨域请求被阻止

解决:在 S3 桶的 CORS 配置中添加:


<CORSConfiguration>
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
    <MaxAgeSeconds>3600</MaxAgeSeconds>
  </CORSRule>
</CORSConfiguration>

同时在 CloudFront 缓存策略中加入 Origin、Access-Control-Request-Method、Access-Control-Request-Headers 请求头白名单。

总结

AWS S3 + CloudFront 是搭建全球加速静态网站的黄金组合:S3 提供 11 个 9 的数据持久性,CloudFront 通过全球 600+ 边缘节点将内容缓存到距用户最近的位置。对于官网、博客、文档站、前端应用等纯静态场景,这套方案在性能、成本和运维便捷性上都远优于传统 VPS。

核心要点回顾:

  1. CloudFront 源站必须用 S3 静态网站托管端点(含 s3-website),不要用自动补全的 REST API 端点
  2. HTML 设短 TTL,静态资源设长 TTL + 版本号,兼顾更新速度与缓存效率
  3. ACM 证书在 us-east-1 申请,CloudFront 只能用该区域的证书
  4. GitHub Actions + aws s3 sync + create-invalidation 实现一键部署
  5. 善用 AWS 免费套餐 + Budgets 告警,控制成本在可预期范围内

本文由 3.chengzicloud.cloud 提供,点击访问首页了解更多 AWS 国际版教程与云计算实战内容。

常见问题(FAQ)

S3 静态网站托管和 CloudFront 必须一起用吗?

不必须,但强烈推荐。纯 S3 托管只支持 HTTP(不支持 HTTPS),且只有单一区域响应。加上 CloudFront 后可获得:HTTPS 支持、全球加速、DDoS 防护(AWS Shield Standard 免费)、缓存优化、自定义错误页面等。

CloudFront 的源站选 S3 桶自动补全还是手动输入静态托管域名?

强烈推荐手动输入静态托管域名(.s3-website-us-east-1.amazonaws.com)。自动补全使用的是 S3 REST API 端点,无法设置默认索引文档和自定义错误页面。这是新手最常见踩坑点。

AWS 免费套餐能覆盖 S3 + CloudFront 吗?

部分覆盖。新用户前 12 个月可享:5GB S3 标准存储 + 20,000 GET 请求 + CloudFront 1TB 出站流量 + 10,000,000 HTTP/HTTPS 请求。对小型个人网站,前 12 个月基本免费用。

CloudFront 缓存更新后用户多久看到新内容?

取决于 TTL 设置。如果设置了 24小时 TTL,最多等 24小时。建议对 HTML 设短 TTL(0-300秒),静态资源设长 TTL 并用版本号命名(如 app.v2.js)。紧急情况使用 create-invalidation 强制刷新(每月前 1000 个路径免费)。

S3 + CloudFront 支持动态内容(如 API)吗?

CloudFront 支持多源站配置。静态资源走 S3 源,动态 API 请求可转发到 Application Load Balancer(ALB)或 API Gateway 源。路径模式:/api/ → ALB 源,/ → S3 源。

如何监控 S3 + CloudFront 的费用?

① AWS Budgets 设置月度费用告警;② CloudWatch 仪表板监控请求数和数据传输量;③ 开启 CloudFront 访问日志(输出到 S3);④ 使用 AWS Cost Explorer 按服务分析费用趋势。

CloudFront 在中国大陆有节点吗?

CloudFront 在中国大陆没有内置节点。如需中国大陆加速,考虑使用 Amazon CloudFront 中国区(需备案)或配合其他 CDN 服务商。

网站被攻击产生天价账单怎么办?

① 启用 AWS Shield Advanced(付费,但提供费用保护);② CloudFront + WAF 设置速率限制规则;③ AWS Budgets 设严格告警 + 自动操作;④ 联系 AWS Support 说明情况,通常会对首次攻击产生的费用酌情减免。