Skip to content

AWS

亚马逊云服务代理商:CloudFront 访问 S3 报 403 Access Denied 排障与 OAC 配置教程

本文由 亚马逊云站代理商『翼龙云/TG @Yilongcloud 撰写』如需转载请注明!

在配置 Amazon CloudFront 分发 Amazon S3 存储桶中的静态资源时,403 Access Denied 是最常见的报错之一。权限配置不当通常是导致该问题的核心原因。本文将针对 2026 年主流的 OAC(Origin Access Control,源访问控制)配置标准,提供完整的排障流程与修复方案。

前置关键提示:

  1. S3 存储桶策略中校验AWS:SourceArn条件必须使用 ArnLike,不能使用 StringEquals,使用 StringEquals 策略将保存失败,权限不生效。
  2. OAC(源访问控制)仅支持 S3 REST API 源站;如果 CloudFront 源站填写 S3 静态网站托管 website 端点,OAC 会完全失效,该场景不可以使用 OAC。
  3. SSEKMS 客户托管密钥加密场景,KMS 密钥策略不能直接授权amazonaws.com服务主体,需要授权 OAC 对应的 Principal ARN。
  4. S3 私有桶下,文件不存在返回 403 而不是 404,容易误判为权限故障;Vue/React SPA 单页应用子路由访问 403,Default Root Object 无法解决,需要 CloudFront Functions 重写。
  5. 提交/*全路径失效会消耗 CloudFront 失效配额,每月仅有 1000 条免费额度,生产环境尽量避免频繁使用全量失效。

一、现象描述

当通过 CloudFront 域名访问 S3 资源时,浏览器返回 HTTP 403 状态码及 Access Denied 错误信息。这通常意味着 CloudFront 向 S3 发起的回源请求未通过身份验证,或被 S3 的存储桶策略、对象权限、KMS 加密设置、WAF 规则拦截。

特别注意:私有 S3 桶,对象文件本身不存在也返回 403,并非 404,排障时优先确认文件真实存在。

二、诊断顺序与排障自查表

在定位问题时,可参考下表进行逐一排查:

错误场景 可能原因 检查与解决方向
全部文件统一返回 403 源站身份配置错误 确认启用 OAC,S3 Bucket Policy 正确授权该 CloudFront 分配;注意条件必须使用 ArnLike 匹配 SourceArn
仅访问域名根路径 / 返回 403,子文件正常 默认根对象缺失 CloudFront 常规设置配置 Default Root Object,例如index.html
SPA 项目,子路由路径(/about、/list)返回 403 缺少路由重写规则 Default Root Object 无法处理子路径,需要配置 CloudFront Functions 实现路径重定向
SSEKMS 加密对象访问报 403 KMS 密钥解密权限不足 修改 KMS 客户托管密钥策略,授予对应 OAC 主体kms:Decrypt权限
部分来源访问 403,其他正常 防盗链 / WAF / 边缘函数拦截 检查 AWS WAF 规则、CloudFront Functions/Lambda@Edge 业务逻辑
修改权限策略之后依旧 403 ①CloudFront 缓存未失效;②S3 策略短暂延迟 提交失效请求清除缓存;Bucket Policy 变更存在数分钟生效延迟;测试 URL 增加随机参数绕过缓存
源站使用 S3 website 静态托管端点全部 403 OAC 不支持 website 端点 切换源站为 S3 REST 格式存储桶域名,方可使用 OAC;website 端点只能用 OAI 或者公开读桶
访问某一个特定文件 403,其余文件正常 单个 S3 对象权限限制 检查该 Object 对象本身 ACL 与权限设置,确认对象真实存在

三、修复步骤:配置 CloudFront OAC

AWS 官方推荐使用 OAC 替代老旧 OAI(Origin Access Identity),OAC 支持 SSEKMS 加密对象,安全性更强。

存量老分配仍存在 OAI,排障时请确认当前源站使用的身份类型。

  1. 创建 OAC 身份进入 CloudFront 控制台,对应分配→源→源访问,新建 OAC,签名行为选择始终签署请求。

该签名模式仅适用于 S3 REST 源站。

  1. 关联到 S3 源站编辑源配置:源域名选择 S3 存储桶 REST 域名,源访问控制选择刚刚创建完成的 OAC 对象,保存源站设置。
  2. 配置 S3 Bucket Policy(核心)进入 S3 存储桶权限,编辑存储桶策略,允许该 CloudFront 分配执行s3:GetObject读取对象。

⚠️重要:匹配aws:SourceArn条件必须使用ArnLike,禁止使用StringEquals。

保存 Bucket Policy,策略变更会存在短暂生效延迟。

四、常见排坑:根对象、SPA 路由与 KMS 权限

  1. 默认根对象配置访问域名根路径报错,但是直接访问/index.html正常,需要在 CloudFront 分配【常规】设置配置 Default Root Object 填入html。

注意:Default Root Object只处理域名根 /,不能处理 SPA 子路由。

  1. SPA 单页应用子路由 403Vue / React 打包静态网站,访问/about、/detail这类子路径返回 403,属于高频故障。 解决方案:部署 CloudFront Functions,将 403/404 回源请求重写为/index.html,实现前端 history 模式路由。
  2. SSEKMS 客户托管加密对象权限如果桶开启 KMS CMK 加密,仅 Bucket Policy 不够。 进入 KMS 对应密钥的【密钥策略】,给OAC 对应的 Principal ARN授予kms:Decrypt权限;不要直接填写amazonaws.com服务主体,否则解密依旧 403。

五、防盗链与缓存控制

  1. Referer 防盗链防盗链逻辑建议放在边缘侧实现。两种方案:关联 AWS WAF 规则校验 Referer 请求头;或者编写轻量 CloudFront Functions 脚本,非法来源直接返回 403。
  2. 缓存 TTL 策略在 CloudFront 分配【行为 Behavior】配置 Minimum TTL、Default TTL、Maximum TTL。合理设置 TTL 减少回源请求,降低 S3 读取请求费用。

六、验证结果

  1. 清除缓存提交失效请求;生产尽量避免直接提交/*全路径失效,避免消耗免费配额;测试可以 URL 拼接随机参数 ?t=xxx绕过缓存。
  2. curl 命令校验

curl -I https://yourcloudfrontdomain.com/index.html

返回HTTP/2 200 OK代表访问正常。

curl 只能看返回状态,不能区分缓存还是真实回源,可观察XCache响应头判断是否命中边缘缓存。

七、常见问题 (FAQ)

Q1:AWS CloudFront 是什么,适合哪些场景,选型时要确认什么? A:CloudFront 是 AWS 全球 CDN,适合静态资源加速、部分动态业务分发、边缘安全防护。选型确认业务覆盖地域、配额限制、计费项(下行流量、请求、回源流量),评估是否需要 WAF、Functions 等附加能力。

Q2:CloudFront 访问 S3 出现 403 Access Denied 主要原因? A:最常见:OAC 未创建或源站未绑定 OAC、S3 Bucket Policy 条件语法错误;其次 KMS 解密权限缺失;SPA 子路由缺少重写;S3 对象本身不存在(私有桶不存在文件返回 403 而非 404);源站误用 S3 静态网站托管端点导致 OAC 失效。

Q3:如何正确配置 CloudFront OAC 访问私有 S3 桶? A:CloudFront 控制台创建 OAC,S3 源站绑定 OAC 身份;S3 存储桶策略授予 cloudfront 服务s3:GetObject权限,使用 ArnLike 条件限制对应 CloudFront 分配 ARN;如果使用 KMS 加密,密钥策略额外授予 OAC 解密权限。

Q4:CloudFront 怎么配置 Referer 防盗链与缓存 TTL? A:防盗链可以通过 AWS WAF 规则,或者 CloudFront Functions 校验请求头;缓存 TTL 在分配的行为(Behavior)规则中设置,区分静态资源、动态接口分别配置。

Q5:SPA 部署到 S3+CloudFront,访问子路径报 403 怎么办? A:Default Root Object 只能处理域名根路径,子路由需要部署 CloudFront Functions 做路径重写,将回源 403/404 请求重定向至index.html。

Q6:S3 对象确认存在,配置 OAC 之后依然返回 403? A:①检查 Bucket Policy 条件是否误用 StringEquals;②确认源站不是 S3website 静态托管端点;③KMS 加密对象检查密钥策略;④等待 Bucket Policy 生效,提交失效清除 CloudFront 缓存。

补充说明:
CDN 与对象存储的权限排障涉及 OAC、KMS 及 WAF 等多个组件。如果您在部署过程中遇到权限拦截或需要优化架构成本,翼龙云/Yilongcloud 作为渠道合作伙伴,可提供售后使用指导,包括控制台操作协助、基础排障定位及云产品搭配建议,助力企业高效构建云端基础设施。

文章标签