You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CloudFront访问S3存储桶遇403拒绝问题求助

问题概述
  • 在us-west-2区域创建默认配置的S3存储桶,上传单个index.html文件
  • 配置CloudFront分发:使用Origin Access Control(OAC),设置默认根对象为index.html,添加自定义域名,复制CloudFront生成的桶策略到S3桶权限中
  • 完成配置并等待分发生效、执行缓存失效后,访问CloudFront分发域名持续返回403 AccessDenied错误;同根账号下的另一个账户执行完全相同步骤可正常访问
  • 桶已启用Bucket Owner Enforced对象所有权,仅支持通过桶策略控制访问
  • 尝试过开启公共访问、修改策略为"允许所有"等操作,均无效;CloudWatch日志仅显示"Access Denied"

错误响应示例:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>******</RequestId>
<HostId>iY6PE****</HostId>
</Error>

CloudFront生成的桶策略:

{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::mybucket-123/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::*****:distribution/*****"
                    }
                }
            }
        ]
      }
排查与解决方案

1. 验证Origin Access Control(OAC)配置

  • 进入CloudFront分发的Origin配置页,确认关联的OAC设置正确:
    • OAC的Origin type必须为S3
    • 必须勾选Sign requests(需确认已修正之前"Do not sign requests"的错误选择)
  • 若OAC为手动创建,检查其设置:需选择S3作为源类型,签名版本选Signature Version 4

2. 确认CloudFront Origin Domain的正确性

  • 确保CloudFront的Origin domain选择的是S3桶的REST API域名(格式:bucket-name.s3.us-west-2.amazonaws.com),而非S3静态网站托管域名(格式:bucket-name.s3-website-us-west-2.amazonaws.com)
  • OAC仅支持通过S3 REST API域名访问,使用静态网站域名会导致签名失效,触发403

3. 校验桶策略中的SourceArn匹配度

  • 复制CloudFront分发的完整ARN(在分发详情页General标签下获取,格式:arn:aws:cloudfront::AWS_ACCOUNT_ID:distribution/DISTRIBUTION_ID)
  • 对比桶策略中Condition.StringEquals.AWS:SourceArn的值,确保完全一致,无账号ID、分发ID的拼写错误

4. 检查对象所有权与桶策略覆盖范围

  • 确认index.html的所有者是桶的所有者(在S3对象详情Permissions标签下查看),Bucket Owner Enforced模式下桶所有者自动拥有对象所有权,无需额外配置对象ACL
  • 桶策略中的Resource为arn:aws:s3:::mybucket-123/*,已覆盖所有对象,无需调整

5. 确认CloudFront分发状态与缓存失效

  • 检查CloudFront分发状态是否为Deployed(生效需等待15-30分钟)
  • 执行缓存失效时,设置失效路径为/*,确保所有缓存内容被清除

6. 检查S3桶的公共访问设置

  • 确保S3桶的Block all public access处于开启状态(OAC模式下无需公开桶或对象,开启公共访问阻止可避免配置冲突)
  • 若之前调整过公共访问设置,确认桶策略中无残留的拒绝公共访问的语句

7. 验证CloudFront默认根对象配置

  • 确认CloudFront分发的Default root object设置为index.html(无前置斜杠)
  • 访问分发域名时直接访问根路径(如https://d1d*****.cloudfront.net),而非带文件名的路径

8. 检查跨账号权限(针对同根账号下的账户差异)

  • 若当前账户为根账号下的IAM用户/角色,确认该身份拥有cloudfront:CreateDistribution、s3:PutBucketPolicy等完整权限
  • 对比正常工作的账户权限配置,排除因权限不足导致的配置遗漏

内容的提问来源于stack exchange,提问作者Bostone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:55:35