我们正尝试通过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

确保Cloudfront可以从S3存储桶读取。

我该如何启用或检查呢?

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

我想我已经试过了,但是没有用,但是我又改变了它,并且正在分发中。我会将存储桶的策略添加到我的帖子中:)

#1 楼

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

要使用CloudFront控制台指定默认根对象,请执行以下操作:


登录AWS管理控制台并通过以下网址打开Amazon CloudFront控制台:https://console.aws.amazon .com / cloudfront /。
在顶部窗格的分发列表中,选择要更新的分发。
在“分发详细信息”窗格的“常规”选项卡上,单击“编辑”。

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

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

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


评论


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

– KurioZ7
19年7月2日在4:56

哦,天哪,为什么这与围绕该主题的任何aws知识答案都不在!谢谢

–外消旋
20-2-21在8:24

#2 楼

我遇到了同样的问题,尽管Kousha的回答确实解决了根目录中index.html的问题,但我的问题还在于子目录,因为我将那些子目录与index.html结合使用以获得“漂亮的url”(示例.com / something /而不是“ ugly” example.com/something.html) ,但如果您选择其中之一,它将使用存储桶URL而不是静态网站托管URL作为后端。 >为存储桶启用静态网站托管
适当设置索引(或错误)文档
复制端点URL-您可以在上述设置旁边找到它-外观应类似于: .s3-website- .amazonaws.com

使用该URL作为CloudFront发行来源。 (这也将使CF Default Root Object设置不必要,但无论如何也不会造成损害)


评论


截至本评论发布之日的完美答案。

–赛·拉马尚德兰(Sai Ramachandran)
18年6月12日在13:12

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

–冈瑟·埃伯(GüntherEberl)
18/09/1在8:01



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

–乔治
18-09-25在21:55

@Georges如何将公共GetObject和ListObjects权限添加到存储桶?

–瑞安
19年11月3日在20:10

@Ryan,您可以在此处检查docs.aws.amazon.com/AmazonS3/latest/dev / ...

–卡卡·鲁托
20年6月21日在21:55

#3 楼

我遇到了与@Cezz相同的问题,尽管该解决方案对我而言不起作用。 URL或S3 URL,这并不总是可取的。例如,就我而言,Cloudfront发行版已启用SSL,并且用户不应通过非SSL连接访问它。

我发现的解决方案是:


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

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

评论


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

– Torsten
17年1月17日在3:20



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

–伊凡
17年9月29日在22:58

#4 楼

就我而言,我在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带有前缀按原始路径:/images,因此进入S3的请求看起来像/images/images/my-image.jpg一样不存在。

解决方案

删除原始路径。

此允许我使用原始访问身份和存储桶权限以及受限制的单个文件权限访问存储桶。

评论


在相关说明中,我有一个CloudFront发行版,其起源有两个:将Cloudfront设置为/ video / *-> My-S3-

–思考力强
20 May 15 '21:01

#5 楼

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

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

#6 楼

我的问题是我关闭了网站托管,不得不将原始名称从网站路径更改为正常的非网站名称。这就删除了原始访问身份。我放回去,一切正常。