题 带有S3的Amazon Cloudfront。拒绝访问


我们尝试通过Cloudfront分发S3存储桶,但出于某种原因,唯一的响应是AccessDenied XML文档,如下所示:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

这是我们正在使用的设置:

Distribution Settings Origin Settings

这是斗的政策

{
    "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/*"
        }
    ]
}

71
2018-03-11 12:32




缓存行为设置 - imgur.com/JBZqrRm - Jordan Adams
确保Cloudfront可以从S3存储桶读取。 - Nathan C
我该如何启用或检查? - Jordan Adams
原点设置,最后一个选项。查看截图。 :) - Nathan C
我想我之前尝试过这个并没有用,但我刚刚改变了它,它正在分发过程中。我将把桶的政策添加到我的帖子:) - Jordan Adams


答案:


如果您要访问CloudFront分配的根目录,则需要设置默认的根对象: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

要使用CloudFront控制台指定默认根对象:

  • 登录AWS管理控制台并在以下位置打开Amazon CloudFront控制台 https://console.aws.amazon.com/cloudfront/

  • 在顶部窗格的分发列表中,选择要更新的分发。

  • 在里面 分发明细窗格,在 一般 选项卡,单击 编辑

  • 在里面 编辑分发 对话框,在 默认根对象 字段,输入默认根对象的文件名。

    仅输入对象名称,例如, index.html。不要在对象名称之前添加/。

  • 要保存更改,请单击 是的,编辑


66
2017-10-16 23:12





我刚刚遇到了同样的问题,而Kousha的回答确实解决了问题 的index.html 在根路径中,我的问题也出现在子目录中,因为我使用了这些子目录 的index.html 得到“漂亮的网址”(example.com/something/而不是“丑陋的”example.com/something.html)

部分也是亚马逊的错,因为当您设置CloudFront分配时,它将为您提供可供选择的S3存储桶,但如果您选择其中一个,它将使用存储桶URL而不是静态网站托管URL作为后端。

所以要解决这个问题:

  • 为存储桶启用静态网站托管
  • 设置 指数 (也许吧 错误)文件适当
  • 复制 端点 URL - 您可以在上面的设置旁边找到它 - 它应该类似于: <bucket.name> .S3-网站 - <AWS-区域> .amazonaws.com
  • 将该URL用作CloudFront分配源。 (这也将成为CF. 默认根对象 设置不必要,但无论如何设置它都没有伤害)

40
2018-05-11 14:01



截至本评论日期的完美答案。 - Sai Ramachandran
这对我来说也是如此。我已经有另一个网站工作,并认为我配置相同的新网站。很容易忽视这一点。 - Günther Eberl
您还需要向存储桶添加公共GetObject和ListObjects权限。 - Georges


我和@ Cezz有同样的问题,虽然解决方案在我的情况下不起作用。

只要为存储桶启用静态网站托管,就意味着用户可以通过Cloudfront URL或S3 URL访问内容,这并不总是令人满意的。例如,就我而言,Cloudfront分发版已启用SSL,用户无法通过非SSL连接访问它。

我找到的解决方案是:

  • 在S3存储桶上禁用静态网站托管
  • 将Cloudfront分发源保留为S3 ID
  • 将“限制存储桶访问”设置为“是”(为方便起见,允许CloudFront自动更新存储桶策略)
  • 在“错误页面”上,创建自定义响应,并将错误代码“403:禁止”映射到所需的响应页面,即/index.html,响应代码为200

请注意,在我的情况下,我正在提供单页javascript应用程序,其中所有路径都由index.html解析。如果您的路径可以解析为S3存储桶中的不同对象,则无法使用。


7
2017-11-18 14:01



感谢您的回答。这个对我有用。我遇到了和你一样的问题。我不希望人们访问我的S3存储桶,因此我需要限制对S3 Origin的访问,这仅适用于您按照Cloudfront中的自动完成建议填写原点时。但需要注意的是,您不必禁用静态网站托管。简单地删除允许公共访问的存储桶策略就足够了。 - Torsten
这真的很有用,禁止的消息来自S3,我最初没有意识到,所以你必须通过自定义错误页面来捕获它,以便你的SPA工作。 - Ivan


在我的情况下,我使用多个来源与“路径模式”行为以及我的S3存储桶中的原始路径:

设置错误:

CloudFront行为: /images/*  - > My-S3-origin

我-S3-产地: 原点路径: /images

S3文件: /images/my-image.jpg

GET请求: /images/my-image.jpg - > 403

发生的事情是整个CloudFront GET请求被发送到原点: /image/my-image.jpg 以Origin Path为前缀: /images,所以进入S3的请求看起来像 /images/images/my-image.jpg 哪个不存在。

删除原始路径。

这允许我访问具有源访问标识和存储桶权限以及单个文件权限的存储桶。


2
2017-11-08 01:10





在我的情况下,我错误地配置了Route 53。我在我的域上创建了一个Alias,但指向了S3 Bucket而不是CloudFront发行版。

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


0
2017-10-14 14:29