带有S3的Amazon Cloudfront。拒绝访问


91

我们正在尝试通过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/*"
        }
    ]
}

缓存行为设置-imgur.com/JBZqrRm
Jordan Adams

确保Cloudfront可以从S3存储桶读取。
内森·C

我将如何启用或检查?
乔丹·亚当斯

原点设置,最后一个选项。查看您的屏幕截图。:)
内森(Nathan C)

我想我早些尝试过,但没有用,但我又做了一次更改,它正在分发中。我会将存储桶的策略添加到我的帖子中:)
Jordan Adams 2014年

Answers:


91

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

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

  • 登录到AWS管理控制台并通过以下网址打开Amazon CloudFront控制台:https: //console.aws.amazon.com/cloudfront/ 。

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

  • 在“ 分发详细信息”窗格中的“ 常规”选项卡上,单击“ 编辑”

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

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

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


就我而言,此设置无法解决问题。我仍然收到“访问被拒绝”错误
KurioZ7

53

我遇到了同样的问题,尽管Kousha的回答确实解决了根目录中index.html的问题,但我的问题还在于子目录,因为我将那些与index.html结合使用的子目录获得了“漂亮的url”(示例.com / something /而不是“难看的” example.com/something.html)

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

因此,要解决此问题:

  • 为存储桶启用静态网站托管
  • 适当设置索引(可能是Error)文档
  • 复制端点 URL-您可以在上述设置旁边找到它-它的外观应类似于:<bucket.name> .s3-website- <aws-region> .amazonaws.com
  • 使用该URL作为您的CloudFront发行来源。(这也将使“ CF 默认根对象”设置不必要,但无论如何也不会造成损害)

截至本评论发表之日的完美答案。
斋月

对我来说也是如此。我已经有另一个网站可以正常工作,并认为我以相同的方式配置了新网站。很容易忽略这一点。
京特EBERL

您还需要向存储桶添加公共GetObject和ListObjects权限。
乔治

8

我有与@Cezz相同的问题,尽管该解决方案在我的情况下不起作用。

一旦为存储桶启用了静态网站托管,这意味着用户可以通过Cloudfront URL或S3 URL来访问内容,这并不总是令人满意的。例如,在我的情况下,Cloudfront发行版已启用SSL,并且用户不应通过非SSL连接访问它。

我发现的解决方案是:

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

请注意,尽管就我而言,我正在提供一个页面的javascript应用程序,其中所有路径都由index.html解析。如果您的路径可以解析为S3存储桶中的其他对象,则此方法将无效。


1
感谢您的回答。这个为我工作。我和你有同样的问题。我不希望人们访问我的S3存储桶,因此我需要限制对S3原点的访问,仅当您按照Cloudfront中自动完成功能的建议填写原点时,该选项才适用。不过,请注意,您不必禁用静态网站托管。只需删除允许公共访问的存储桶策略就足够了。
Torsten

这真的很有帮助,禁止的消息来自S3,我最初没有意识到,因此您必须在自定义错误页面上捕获该消息,以便SPA起作用。
伊凡(Ivan)

4

就我而言,我在S3存储桶中使用了具有“路径模式”行为的多个起点以及一个起点路径:

设置错误:

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

My-S3来源:来源路径: /images

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

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

发生的事情是整个CloudFront GET请求都发送到origin:(/image/my-image.jpg以Origin Path:为前缀)/images,因此到S3的请求看起来好像/images/images/my-image.jpg不存在。

删除原始路径。

这使我能够使用原始访问身份和存储桶权限以及受限制的单个文件权限来访问存储桶。


1

就我而言,我错误地配置了Route 53。我在我的域上创建了一个别名,但将其指向S3存储桶而不是CloudFront发行版。

我也省略了默认的根对象。如果控制台在问号文本中添加了一些有关省略它的潜在后果的信息,则可以真正改进该控制台。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.