一、方案逻辑:为何弃用传统 EC2 服务器
相比于在 EC2 或其他云服务器上运行 Nginx,S3 + CloudFront 架构具有以下特征:
- 全托管服务:无需处理系统补丁或环境维护,属于 Serverless 架构。
- 边缘加速:CloudFront 将内容缓存至全球边缘站点,用户就近获取,减少物理距离带来的延迟。
- 源站加固:通过 OAC 彻底关闭 S3 的公网访问,仅允许来自 CloudFront 的合法请求,规避源站被直接爬取、盗刷流量风险。
重要说明:本方案使用 S3 REST 接口,不要开启 S3 静态网站托管;开启静态网站托管需要开启公网可读,会破坏 OAC 私有安全架构。
二、部署前准备
1.AWS 账号:需拥有已激活的 AWS 国际区账号。若在注册开户、绑定外币卡或支付充值时遇到困难,可咨询云枢国际 /yunshuguoji 获取开户协助与多元化支付充值支持。 2. 域名与文件:准备好已管理的域名,以及前端打包后的静态文件(如 dist 目录)。
三、配置私有 S3 存储桶
- 在 S3 控制台创建存储桶,桶名称全局唯一,建议和业务域名保持一致;选择靠近核心用户群体的地域。
- 权限设置:权限页面开启 阻止所有公开访问(全部四项勾选)。
- 上传资源:将html、js、css、图片等静态资源上传至 Bucket 根目录;自动化部署可使用 AWS CLI 命令:
bash
aws s3 sync ./dist s3://your-bucket-name
四、配置 CloudFront 全球分发
- CloudFront 控制台,点击【创建分发】。
- 源站配置
- 源域:选择刚刚创建的 S3 存储桶(REST 接口,不要选网站端点)
- 源访问:选择 Origin access control settings (recommended),新建 OAC 控制配置并保存。
- 源协议策略:HTTPS Only
创建分发之后,控制台会生成 S3 桶策略 JSON,复制完整策略,粘贴到 S3 存储桶【权限存储桶策略】;不要手动修改 OAC 对应的 Principal 主体。
- 默认缓存行为
- 查看器协议策略:Redirect HTTP to HTTPS
- 缓存策略:推荐 CachingOptimized,提升边缘缓存命中率。
- 必填配置:Default root object(默认根对象)填写 html,不配置会直接出现根域名 403 报错。
- SPA 路由两种实现方案(二选一)
背景:OAC 私有 S3,访问不存在路径返回 403 而非 404,需要捕获 403/404 做前端路由适配。
方案 A:自定义错误页面(简易,适合测试、小型站点,存在缓存污染缺陷)
进入【错误页面】,创建两组自定义错误响应:
- HTTP 错误码 403;自定义是;响应页面路径/index.html;响应码 200OK
- HTTP 错误码 404;自定义是;响应页面路径/index.html;响应码 200OK
⚠️局限:该方案会把所有子路由缓存 Key 统一为 /index.html,浏览器刷新不同子路由会出现页面内容错乱,生产业务优先选择方案 B。
方案 B:CloudFront Functions URI 重写(生产推荐,无缓存污染)
新建 CloudFront Function,编写 URI 重写逻辑:没有文件后缀的请求追加/index.html;挂载到【源请求事件】,不需要配置自定义错误页面,子路由缓存隔离,无页面错乱问题。
提示:分发配置修改完成后,需要等待 515 分钟全球边缘节点部署生效,不要立刻测试。
五、域名绑定与 HTTPS 加密
- ACM 证书申请:切换 ACM 控制台区域到 useast1(弗吉尼亚北部),申请公有证书,使用 DNS 域名验证。
关键提醒:DNS 验证生成的 CNAME 记录不能删除,删除会导致证书无法自动续期;第三方导入证书 ACM 不会自动续期,需要自行维护生命周期。
- CloudFront 分发设置,【备用域名 (CNAME)】填入业务自定义域名,选择刚刚申请好的 ACM 证书。
- DNS 解析服务商,添加 CNAME 记录,将业务域名指向 CloudFront 分配的.cloudfront.net域名,记录值不要带 http/https 前缀。
六、进阶配置与成本维度
- 缓存失效 Invalidation前端代码更新完成,创建失效请求;大批量更新优先填写路径/*(计 1 条配额)。
成本规则:每月前 1000 条失效路径免费,超出按路径计费;CLI 执行失效命令”/*”必须加英文引号,否则命令报错;失效任务显示 Completed 代表任务下发,边缘完整清除缓存还需要数分钟传播时延。
- 计费项拆解 (Pricing Dimensions)
| 服务 | 核心计费项 | 说明 |
| S3 | 存储容量费 | 按月实际存储 GB 计费 |
| GET 请求费 | CloudFront 回源拉取资源产生请求;配置合理 CacheControl 可降低回源频次 | |
| CloudFront | 数据传出费 | 边缘节点流向互联网流量,按地域区分单价 |
| 请求次数费 | HTTP/HTTPS 访问请求计费 | |
| 缓存失效费 | 每月前 1000 个路径免费,超出按次计费 | |
| CloudFront Functions 调用费 | 使用函数重写路由会产生小额调用计费 |
七、资源完整清理顺序(测试环境销毁必看)
- 禁用并删除 CloudFront 分发;
- 删除分发关联的 OAC 资源;
- 清空对象,删除 S3 存储桶;
- ACM 证书不会自动删除,无用证书手动清理。
八、常见故障排查清单
- 访问域名根路径返回 403:检查是否填写Default root object: index.html;确认 OAC 桶策略已经正确写入 S3。
- SPA 子路由刷新页面内容错乱:使用【方案 A 自定义错误页面】导致缓存污染,切换到 CloudFront Functions 重写路由方案。
- HTTPS 证书告警:确认 ACM 证书是 useast1 区域;DNS 验证 CNAME 记录没有被删除。
- 配置修改之后访问依旧是旧页面:等待 CloudFront 全球部署完成,或执行缓存失效。
常见问题 (FAQ)
Q1:AWS 对象存储与其他方案怎么比较,选型时应看哪些指标? 比较时应综合考量区域与产品可用性、规格性能、网络与存储表现、数据库和安全配套、计费结构、技术生态及支持方式。建议建立涵盖业务适配、网络体验和可靠性的对比表,先进行小规模验证,避免仅凭单一实例标价做决策。
Q2:AWS 对象存储与云硬盘有什么区别,费用和场景怎么比较? 对象存储(如 S3)适合海量图片、备份和静态资源,通过 API 访问,按容量、请求数和出网流量计费;云硬盘(EBS)是挂载到实例的块设备,适合系统盘和数据库,主要按预置容量和 IOPS 计费。
Q3:AWS CloudFront 是什么,适合哪些场景,选型时要确认什么? CloudFront 是全球 CDN 服务,用于加速分发静态和动态内容。采购前需核对地域覆盖、资源配额、依赖服务及迁移方案。费用通常按下行流量、请求次数和回源流量计费,不同地域的计费口径存在差异。
Q4:如何配置 CloudFront OAC 以限制只能通过 CDN 访问 S3? 在 CloudFront 源设置中选择Origin access control settings,创建 OAC 后,将系统生成的 JSON 策略添加到 S3 存储桶策略中。同时确保存储桶开启 “阻止所有公开访问”,S3 拒绝除 CloudFront 之外所有直接公网访问请求。
Q5:访问根域名返回 403,已经配置 OAC 是什么原因? 最常见原因是 CloudFront 分发没有填写Default root object: index.html;OAC 私有 S3 REST 接口不会自动读取 index.html,必须手动配置默认根对象。
Q6:SPA 使用自定义错误页面方案,子路由刷新页面错乱怎么解决? 自定义错误页面会产生缓存污染;生产环境改用 CloudFront Functions 实现 URI 重写路由,该方案各个路由缓存互相隔离,不会出现页面错乱。
