我在我的 S3 存储桶中使用以下 CF 策略:
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<mybucket>/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::xxxxxxxxxxx:distribution/E3KFW1xxxxxxx"
}
}
}
]
}
使用 Origin 访问控制。
错误:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>WB810TMZGMYRRE6N</RequestId>
<HostId>
EU8t4ysVGXo6TpYMNhmypgBWzZ4TMnlbEgYABlF/sK2hm70octviejQocM3zx0z/Sf4cSk/1nNh2u5zK5EeYDw==
</HostId>
</Error>
答案1
先做简单的事情。
确保对象确实存在于您请求它的位置。这似乎很明显,但如果您在 CF 行为上定义了“路径模式”,请确保对象位于相同的 [区分大小写] 路径中。
仔细检查策略中的分发 ARN 是否与您尝试从中请求资源的分发相匹配。
仔细检查 CF 分布中的 CF 原点是否配置为使用原点访问控制 (OAC)。
确保 CF 行为(可能是默认行为)选择了正确的源。如果您使用具有多个 S3 存储桶的源组,请确保将适当的访问策略应用于所有存储桶。
如果 S3 存储桶中的对象不属于该存储桶,则存储桶策略可能不适用于该对象。新创建的存储桶默认禁用 ACL,但较旧的存储桶可能仍允许非存储桶所有者拥有存储桶内的对象。如果是这种情况并且您无法禁用 ACL,则您需要复制对象(以更改所有者)或深入了解允许公开读取的 ACL。
我强烈建议禁用 ACL。它们默认被禁用是有原因的。
提供 CF OAC 身份/条件 s3:ListBucket 访问权限(访问 bucket arn:aws:s3:::<mybucket>
,而不是 path arn:aws:s3:::<mybucket>/*
)应在对象不存在时将行为从 403 更改为 404。如果实际上是访问问题,您仍会收到 403,但如果是对象名称/位置问题,则会开始收到 404。
如果其他方法都失败了,您可以尝试 S3 访问日志(请求是否到达那里以及谁请求了什么)。