Amazon Cloudfront 与 S3。访问被拒绝

Amazon Cloudfront 与 S3。访问被拒绝

我们正在尝试通过 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 分发。

我还省略了默认根对象。如果他们在问号文本中添加一些关于省略它的潜在后果的信息,控制台确实可以得到改进。

相关内容