我们正在尝试通过 Cloudfront 分发 S3 存储桶,但由于某种原因,唯一的响应是如下所示的 AccessDenied XML 文档:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>89F25EB47DDA64D5</RequestId>
<HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>
以下是我们使用的设置:
这是存储桶的策略
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::x***-logos/*"
}
]
}
答案1
如果您正在访问 CloudFront 分发的根,则需要设置默认根对象: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html
要使用 CloudFront 控制台指定默认根对象:
登录 AWS 管理控制台并打开 Amazon CloudFront 控制台https://console.aws.amazon.com/cloudfront/。
在顶部窗格的分发列表中,选择要更新的分发。
在里面分发详细信息窗格,在一般的选项卡,点击编辑。
在里面编辑分布对话框中默认根对象字段中,输入默认根对象的文件名。
仅输入对象名称,例如
index.html
。请勿在对象名称前添加 /。要保存更改,请点击是的,编辑。
答案2
我刚刚遇到了同样的问题,虽然 Kousha 的答案确实解决了这个问题索引.html在根路径中,我的问题也出在子目录上,因为我使用了与索引.html获取“漂亮的网址”(example.com/something/ 而不是“丑陋的”example.com/something.html)
部分地这也是亚马逊的错误,因为当您设置 CloudFront 分发时,它会为您提供 S3 存储桶供您选择,但如果您选择其中一个,它将使用存储桶 URL 而不是静态网站托管 URL 作为后端。
因此,要解决这个问题:
- 为存储桶启用静态网站托管
- 设置指数(也许错误)适当记录
- 复制端点URL - 您可以在上面的设置旁边找到它 - 它看起来应该像这样:<bucket.name>.s3-website-<aws-region>.amazonaws.com
- 使用该 URL 作为您的 CloudFront Distribution 源。(这也会使得 CF默认根对象设置是不必要的,但无论如何设置它也不会有什么坏处)
更新 1 月 22 日:您也可以通过保持静态托管关闭并添加 CloudFront 函数来解决这个问题index.html
。请参阅这篇文章了解更多信息。这允许您使用 OAI 并将存储桶保持私密。
答案3
我遇到了与@Cezz 相同的问题,但该解决方案对我的情况不起作用。
一旦为存储桶启用了静态网站托管,就意味着用户可以通过 Cloudfront URL 或 S3 URL 访问内容,但这并不总是可取的。例如,在我的例子中,Cloudfront 发行版启用了 SSL,用户不应该能够通过非 SSL 连接访问它。
我发现的解决方案是:
- 保持 S3 存储桶上的静态网站托管处于禁用状态
- 将 Cloudfront 分发来源保留为 S3 ID
- 将“限制存储桶访问”设置为“是”(为方便起见,允许 CloudFront 自动更新存储桶策略)
- 在“错误页面”上,创建自定义响应,并将错误代码“403:禁止”映射到所需的响应页面,即/index.html,响应代码为 200
但请注意,在我的例子中,我提供的是单页 javascript 应用程序,其中所有路径都由 index.html 解析。如果您的路径解析为 S3 存储桶中的不同对象,则此方法不起作用。
答案4
就我而言,我错误地配置了 Route 53。我在我的域上创建了一个别名,但将其指向 S3 Bucket 而不是 CloudFront 分发。
我还省略了默认根对象。如果他们在问号文本中添加一些关于省略它的潜在后果的信息,控制台确实可以得到改进。