AWS S3 + CloudFront 搭建全球加速静态网站完整教程(2026最新版)
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 53 | DNS解析,域名指向CloudFront | 按托管区 + 查询次数 |
| ACM | 免费SSL/TLS证书,绑定CloudFront | 免费 |
步骤一:创建 S3 存储桶并开启静态网站托管
1.1 通过 AWS 控制台创建 S3 桶
- 登录 AWS Management Console
- 点击 创建存储桶(Create bucket)
- 填写配置:
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 桶名称 | www.yourdomain.com | 必须与域名一致(用于静态托管) |
| AWS 区域 | us-east-1(北弗吉尼亚) | CloudFront 源站免数据传输费 |
| 阻止公共访问 | 取消勾选 | 静态网站需要公开读取 |
| 存储桶版本控制 | 启用 | 方便回滚 |
- 点击「创建存储桶」
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(北弗吉尼亚)区域申请!
- 切换到 us-east-1 区域
- 进入 ACM 控制台
- 点击 请求证书(Request certificate) → 请求公有证书
- 填写域名:
yourdomain.com*.yourdomain.com(通配符,覆盖所有子域名)
- 验证方法选择 DNS 验证(推荐,可自动续期)
- 在 Route 53 中点击「创建记录」自动添加验证记录
- 等待验证通过(通常 1-5 分钟)
步骤三:创建 CloudFront 分发
3.1 创建分发配置
- 进入 CloudFront 控制台
- 点击 创建分发(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 | 原因 |
|---|---|---|
*.html | 0-300秒 | 内容更新频繁,需及时刷新 |
.css, .js | 30天 | 使用版本号/哈希命名,永久缓存 |
.png, .jpg, *.svg | 180天 | 静态资源极少变动 |
.woff2, .ttf | 365天 | 字体文件几乎从不变化 |
步骤四:配置 Route 53 DNS 指向 CloudFront
- 进入 Route 53 控制台
- 选择你的托管区域 → 创建记录
- 配置:
| 记录类型 | 记录名称 | 值/流量路由 |
|---|---|---|
| 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 TB | 10-50 TB | 50-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 GB | 50 GB | $1-2 | $5 VPS |
| 中型企业站 | 10 GB | 500 GB | $15-25 | $20-40 VPS |
| 大型内容站 | 100 GB | 5 TB | $70-120 | $100-200+ 服务器 |
| 超大型 | 1 TB | 50 TB | $500-800 | $1000+ CDN |
💡 10个省钱技巧
- CloudFront 源站选 us-east-1:S3 → CloudFront(同区域)免数据传输费
- 开启 S3 智能分层:访问模式不固定时自动降冷,省 40-60% 存储费
- CloudFront 价格等级选「北美+欧洲」:如果用户集中在欧美,省 30-50%
- 启用 Gzip/Brotli 压缩:CloudFront 自动压缩文本文件,减少 60-80% 流量
- 合理设置 TTL:长缓存减少回源请求(S3 GET 按次收费)
- S3 生命周期策略:旧版本 30 天后自动删除
- CloudFront 预留容量:承诺月度最低消费可享 15-20% 折扣
- 使用 AWS Budgets 设置告警:月度费用超 $10/$50/$100 自动发邮件提醒
- CloudFront 日志:仅排查问题时开启,避免 S3 日志存储费累积
- AWS 免费套餐:新用户前 12 个月每月 5GB S3 标准存储 + 20,000 GET 请求免费
S3 + CloudFront 静态网站 vs 其他方案对比
| 维度 | S3 + CloudFront | AWS Lightsail | VPS(传统) | 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.html | 200 |
| 404 | /index.html | 200 |
问题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。
核心要点回顾:
- CloudFront 源站必须用 S3 静态网站托管端点(含
s3-website),不要用自动补全的 REST API 端点 - HTML 设短 TTL,静态资源设长 TTL + 版本号,兼顾更新速度与缓存效率
- ACM 证书在 us-east-1 申请,CloudFront 只能用该区域的证书
- GitHub Actions +
aws s3 sync+create-invalidation实现一键部署 - 善用 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 说明情况,通常会对首次攻击产生的费用酌情减免。