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

使用CDK部署静态站点时S3 OriginAccessIdentity仍报403访问拒绝

解决CloudFront+S3 OAI部署静态站点的403 AccessDenied错误

以下是针对你的代码和问题的具体排查及修复步骤:

1. 修复S3静态网站托管与OAI的兼容性冲突

你同时启用了S3静态网站托管(配置了websiteIndexDocument)和使用S3Origin+OAI,这两者存在核心冲突:

  • OAI是用于授权访问S3对象存储API的机制,而S3静态网站托管依赖独立的HTTP端点,OAI无法对该端点进行权限验证。
  • 正确做法是关闭S3静态网站托管,由CloudFront处理索引文档和错误页面逻辑(你已在CloudFront中配置了相关规则)。

修改S3 Bucket初始化代码,移除静态网站相关配置:

const siteBucket = new s3.Bucket(this, "SiteBucket", {
  bucketName: siteDomain,
  autoDeleteObjects: true,
  publicReadAccess: false,
  removalPolicy: RemovalPolicy.DESTROY, // not for production
  // 移除以下两行静态网站配置
  // websiteIndexDocument: "index.html",
  // websiteErrorDocument: "error.html",
});

2. 验证桶策略的正确性

尽管你使用了siteBucket.grantRead(oai),仍需确认CDK生成的桶策略是否包含正确权限:

  • 策略需允许OAI用户访问桶内所有对象(资源路径为arn:aws:s3:::${siteDomain}/*)
  • 需明确授予s3:GetObject权限

你可在AWS控制台的S3桶权限页面查看生成的策略,确保类似以下内容:

{
  "Version": "2008-10-17",
  "Id": "PolicyForCloudFrontPrivateContent",
  "Statement": [
    {
      "Sid": "1",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ${OAI_ID}"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::${siteDomain}/*"
    }
  ]
}

若策略缺失或配置错误,可手动补充,或检查CDK代码是否存在其他权限覆盖逻辑。

3. 确认CloudFront分发状态

在AWS控制台CloudFront页面,检查分发状态是否为Deployed。若状态为In Progress,需等待10-15分钟部署完成后再测试访问。

4. 验证对象存在性与命名一致性

确保index.html和error.html已正确上传至S3桶根路径,且文件名大小写与配置完全一致(S3对象名区分大小写)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:27