你现在决定只保留 CloudFront 并移除 Amplify 相关权限是完全正确的,这能彻底消除配置冲突,让整个架构更简洁。我先肯定你的思路,然后帮你优化这份 Policy 并给出完整的部署步骤。
你的新 Policy 核心优化点
这份 Policy 已经移除了 Amplify 相关冗余规则,但还有两个关键问题需要修复,否则依然会导致访问失败:
1. 修复日志存储路径错误
AWSLogDeliveryWrite1 中的 Resource 包含了错误的 index.htm/ 前缀,日志应该直接存到 AWSLogs 目录下,而非 index.htm/AWSLogs:json
// 错误路径
"Resource": "arn:aws:s3:::staroceans.org/index.htm/AWSLogs/441118265725/*"
// 正确路径
"Resource": "arn:aws:s3:::staroceans.org/AWSLogs/441118265725/*"
2. 可选优化:合并日志相关规则
将
AWSLogDeliveryWrite1 和 AWSLogDeliveryAclCheck1 合并为一条规则,减少 Policy 冗余。最终可直接使用的完整 Policy
json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::staroceans.org/*"
},
{
"Sid": "AllowOwnerWrite",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::441118265725:root"
},
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::staroceans.org",
"arn:aws:s3:::staroceans.org/*"
]
},
{
"Sid": "AWSLogDeliveryPermissions",
"Effect": "Allow",
"Principal": {
"Service": "delivery.logs.amazonaws.com"
},
"Action": [
"s3:PutObject",
"s3:GetBucketAcl"
],
"Resource": [
"arn:aws:s3:::staroceans.org",
"arn:aws:s3:::staroceans.org/AWSLogs/441118265725/*"
],
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"aws:SourceAccount": "441118265725"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:logs:us-east-1:441118265725:*"
}
}
},
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::staroceans.org/*",
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:cloudfront::441118265725:distribution/E29GLOUGZGOW4X"
}
}
}
]
}
配套部署步骤(确保 CloudFront 能正常访问)
步骤 1:应用修正后的 Policy
- 进入 S3 控制台 → 选择
staroceans.org→ 权限 → Bucket Policy - 删除原有内容,粘贴上面的完整 Policy → 保存
步骤 2:关闭 S3 的 Block Public Access
这是解决 403 错误的核心:
- S3 bucket → 权限 → Block public access (bucket settings)
- 取消勾选「Block all public access」→ 保存
步骤 3:确认 S3 静态网站托管配置
- S3 bucket → 属性 → 静态网站托管 → 确保「已启用」
- 索引文档填写
index.htm(和你 bucket 中的主页文件名一致)→ 保存 - 复制「网站端点」(如
staroceans.org.s3-website-us-east-1.amazonaws.com)
步骤 4:修正 CloudFront 源配置
- 进入 CloudFront 控制台 → 选择你的分发(E29GLOUGZGOW4X)→ 编辑源
- 源域名:填写步骤 3 复制的 S3 网站端点(不是 REST API 端点)
- Origin path:留空(不要填任何内容)
- 协议:选择「HTTP only」(S3 网站端点仅支持 HTTP)→ 保存
步骤 5:设置 CloudFront 默认根对象
- CloudFront 分发 → 常规设置 → 编辑
- 默认根对象:填写
index.htm→ 保存
步骤 6:清理 CloudFront 缓存
- CloudFront 分发 → 缓存 → 创建失效
- 路径填
/*→ 确认创建(等待 1-5 分钟生效)
总结
- 核心优化:移除 Amplify 冗余规则、修复日志存储路径、合并日志权限,Policy 更简洁且无冲突。
- 关键操作:关闭 S3 的 Block Public Access 让 Policy 生效,CloudFront 源域名必须用 S3 网站端点且 Origin path 留空。
- 访问逻辑:用户通过 CloudFront 访问 → CloudFront 从 S3 网站端点拉取
index.htm→ 正常返回主页,无 HTTP/HTTPS 冲突。
完成以上步骤后,访问你的 CloudFront 域名(如
www.staroceans.net)就能正常打开主页了。如果仍有问题,优先检查 S3 网站端点能否直接访问(http://staroceans.org.s3-website-us-east-1.amazonaws.com),能访问则问题在 CloudFront,不能访问则检查 S3 权限。