如何在AWS中排查CloudFront的Access Denied错误?
CloudFront Access Denied错误排查步骤
你遇到的错误信息如下:
<Error> <Code>AccessDenied</Code> <Message>Access Denied</Message> <RequestId>EKJDP6E2XYVXCG7A</RequestId> <HostId>zxIi9s/XlmtD88G6fozk6q5aWzRnHckTa0vsm5WGVHZ2t/MoFnv/OP900WltWM17kB/hePk1UvY=</HostId> </Error>
以下是CloudTrail无相关记录情况下的具体排查方向:
1. 验证源站权限配置
如果源站是S3:
- 检查桶策略:确认是否包含允许CloudFront OAC(Origin Access Control)或OAI(Origin Access Identity)访问的语句。示例策略片段:
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "1", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::your-account-id:distribution/your-distribution-id" } } } ] } - 检查对象权限:确保S3对象的ACL未设置为完全私有,或已授权OAC/OAI读取权限;同时确认桶的默认权限允许读取操作。
- 检查存储类:若对象使用Glacier等归档存储类,需先完成恢复流程才能访问。
如果源站是自定义HTTP服务器:
- 确认源站的防火墙、安全组或内部权限规则未拒绝CloudFront的请求,查看源站访问日志是否存在403拦截记录。
2. 检查CloudFront OAC/OAI配置
- 确认CloudFront分发的源设置中,已正确关联对应的OAC或OAI,未使用"公共访问"模式(适用于私有S3源场景)。
- 对于OAC:登录S3控制台,检查目标桶的「权限」选项卡,确认已启用「Origin Access Control设置」并选择对应CloudFront OAC。
- 对于OAI:确认OAI已被添加到S3桶的权限列表中,允许其执行
s3:GetObject操作。
3. 核对缓存行为与请求路径
- 检查CloudFront分发的缓存行为规则,确认请求路径匹配了对应的缓存行为,且该行为允许的HTTP方法(如GET、HEAD)与请求一致。
- 注意S3路径区分大小写,需确保请求路径的大小写与S3对象实际路径完全一致。
4. 排查WAF/Shield规则拦截
- 检查CloudFront关联的WAF Web ACL,确认是否有IP黑名单、SQL注入防护等规则触发了403拦截。可临时禁用WACL测试,或查看WAF日志中的拦截详情。
- 检查AWS Shield高级防护规则,确认是否有异常流量被拦截。
5. 启用并分析源站访问日志
- 对于S3源:启用S3桶访问日志,查看日志中对应请求的详细信息,包括请求者身份、错误代码的具体触发原因。
- 对于自定义源:查看源站服务器的访问日志,确认请求是否到达源站,以及源站返回403的具体原因。
6. 检查边缘缓存与请求头
- 确认请求未携带被CloudFront或源站拒绝的自定义头信息。
- 使用
curl -v命令发起请求,查看完整的请求/响应头,排查是否存在异常头或重定向问题。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

