使用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
相关产品推荐
相关产品推荐

