通过 Amazon S3 配合 Amazon CloudFront 部署静态资源(HTML、JS、图片等),是目前实现高可用、免运维网站的主流方案。这种架构利用边缘节点降低全球访问延迟,且无需管理服务器。 本文将基于 2026 年 AWS 安全标准,重点介绍如何使用 OAC(Origin Access Control) 保护私有 S3 源站,并解决 SPA 单页应用路由异常、缓存、计费配置问题。

一、方案逻辑:为何弃用传统 EC2 服务器

相比于在 EC2 或其他云服务器上运行 Nginx,S3 + CloudFront 架构具有以下特征:

  1. 全托管服务:无需处理系统补丁或环境维护,属于 Serverless 架构。
  2. 边缘加速:CloudFront 将内容缓存至全球边缘站点,用户就近获取,减少物理距离带来的延迟。
  3. 源站加固:通过 OAC 彻底关闭 S3 的公网访问,仅允许来自 CloudFront 的合法请求,规避源站被直接爬取、盗刷流量风险。

重要说明:本方案使用 S3 REST 接口,不要开启 S3 静态网站托管;开启静态网站托管需要开启公网可读,会破坏 OAC 私有安全架构。

二、部署前准备

1.AWS 账号:需拥有已激活的 AWS 国际区账号。若在注册开户、绑定外币卡或支付充值时遇到困难,可咨询云枢国际 /yunshuguoji 获取开户协助与多元化支付充值支持。 2. 域名与文件:准备好已管理的域名,以及前端打包后的静态文件(如 dist 目录)。

三、配置私有 S3 存储桶

  1. 在 S3 控制台创建存储桶,桶名称全局唯一,建议和业务域名保持一致;选择靠近核心用户群体的地域。
  2. 权限设置:权限页面开启 阻止所有公开访问(全部四项勾选)。
  3. 上传资源:将html、js、css、图片等静态资源上传至 Bucket 根目录;自动化部署可使用 AWS CLI 命令:

bash

aws s3 sync ./dist s3://your-bucket-name

四、配置 CloudFront 全球分发

  1. CloudFront 控制台,点击【创建分发】。
  2. 源站配置
    1. 源域:选择刚刚创建的 S3 存储桶(REST 接口,不要选网站端点)
    2. 源访问:选择 Origin access control settings (recommended),新建 OAC 控制配置并保存。
    3. 源协议策略:HTTPS Only

创建分发之后,控制台会生成 S3 桶策略 JSON,复制完整策略,粘贴到 S3 存储桶【权限存储桶策略】;不要手动修改 OAC 对应的 Principal 主体。

  1. 默认缓存行为
    1. 查看器协议策略:Redirect HTTP to HTTPS
    2. 缓存策略:推荐 CachingOptimized,提升边缘缓存命中率。
  2. 必填配置:Default root object(默认根对象)填写 html,不配置会直接出现根域名 403 报错。
  3. SPA 路由两种实现方案(二选一)

背景:OAC 私有 S3,访问不存在路径返回 403 而非 404,需要捕获 403/404 做前端路由适配。

方案 A:自定义错误页面(简易,适合测试、小型站点,存在缓存污染缺陷)

进入【错误页面】,创建两组自定义错误响应:

  1. HTTP 错误码 403;自定义是;响应页面路径/index.html;响应码 200OK
  2. HTTP 错误码 404;自定义是;响应页面路径/index.html;响应码 200OK

⚠️局限:该方案会把所有子路由缓存 Key 统一为 /index.html,浏览器刷新不同子路由会出现页面内容错乱,生产业务优先选择方案 B

方案 B:CloudFront Functions URI 重写(生产推荐,无缓存污染)

新建 CloudFront Function,编写 URI 重写逻辑:没有文件后缀的请求追加/index.html;挂载到【源请求事件】,不需要配置自定义错误页面,子路由缓存隔离,无页面错乱问题。

提示:分发配置修改完成后,需要等待 515 分钟全球边缘节点部署生效,不要立刻测试。

五、域名绑定与 HTTPS 加密

  1. ACM 证书申请:切换 ACM 控制台区域到 useast1(弗吉尼亚北部),申请公有证书,使用 DNS 域名验证。

关键提醒:DNS 验证生成的 CNAME 记录不能删除,删除会导致证书无法自动续期;第三方导入证书 ACM 不会自动续期,需要自行维护生命周期。

  1. CloudFront 分发设置,【备用域名 (CNAME)】填入业务自定义域名,选择刚刚申请好的 ACM 证书。
  2. DNS 解析服务商,添加 CNAME 记录,将业务域名指向 CloudFront 分配的.cloudfront.net域名,记录值不要带 http/https 前缀。

六、进阶配置与成本维度

  1. 缓存失效 Invalidation前端代码更新完成,创建失效请求;大批量更新优先填写路径/*(计 1 条配额)。

成本规则:每月前 1000 条失效路径免费,超出按路径计费;CLI 执行失效命令”/*”必须加英文引号,否则命令报错;失效任务显示 Completed 代表任务下发,边缘完整清除缓存还需要数分钟传播时延。

  1. 计费项拆解 (Pricing Dimensions)
服务 核心计费项 说明
S3 存储容量费 按月实际存储 GB 计费
  GET 请求费 CloudFront 回源拉取资源产生请求;配置合理 CacheControl 可降低回源频次
CloudFront 数据传出费 边缘节点流向互联网流量,按地域区分单价
  请求次数费 HTTP/HTTPS 访问请求计费
  缓存失效费 每月前 1000 个路径免费,超出按次计费
  CloudFront Functions 调用费 使用函数重写路由会产生小额调用计费

 

七、资源完整清理顺序(测试环境销毁必看)

  1. 禁用并删除 CloudFront 分发;
  2. 删除分发关联的 OAC 资源;
  3. 清空对象,删除 S3 存储桶;
  4. ACM 证书不会自动删除,无用证书手动清理。


八、常见故障排查清单

  1. 访问域名根路径返回 403:检查是否填写Default root object: index.html;确认 OAC 桶策略已经正确写入 S3。
  2. SPA 子路由刷新页面内容错乱:使用【方案 A 自定义错误页面】导致缓存污染,切换到 CloudFront Functions 重写路由方案。
  3. HTTPS 证书告警:确认 ACM 证书是 useast1 区域;DNS 验证 CNAME 记录没有被删除。
  4. 配置修改之后访问依旧是旧页面:等待 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 重写路由,该方案各个路由缓存互相隔离,不会出现页面错乱。

相关新闻

联系我们

联系我们

电报:@yilongcloud

邮件:yilongcloud@hotmail.com

工作时间:早上8:00-晚上11:00

认准电报
认准电报
分享本页
返回顶部