亚马逊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/*" } ] } 

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

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

  • loginAWSpipe理控制台并通过以下url打开Amazon CloudFront控制台: https: //console.aws.amazon.com/cloudfront/。

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

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

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

    只input对象名称,例如index.html 。 不要在对象名称前加上/。

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

我刚刚有同样的问题,虽然Kousha的答案确实解决了在根pathindex.html的问题,我的问题也是与子目录,因为我用这些index.html结合“漂亮的url”(例如.com / something /而不是“丑陋”example.com/something.html)

部分也是亚马逊的错,因为当你设置CloudFront发行版时,它会为你提供S3桶可供select,但是如果你select其中一个,它将使用桶URL而不是静态网站托pipeURL作为后端。

所以要解决这个问题:

  • 为存储桶启用静态网站托pipe
  • 适当地设置索引 (也许错误 )文件
  • 复制端点url – 您可以在上述设置旁find它 – 它应该看起来像: <bucket.name> .s3-website- <aws-region> .amazonaws.com
  • 将该URL用作您的CloudFront分发源。 (这也将使CF 默认根对象设置不必要,但不伤害无论如何设置)

我和@Cezz有同样的问题,虽然解决scheme不适用于我的情况。

只要为存储区启用了静态网站托pipe,就意味着用户可以通过Cloudfront URL或S3 URL来访问该内容,这并不总是可取的。 例如,就我而言,Cloudfront分发是启用SSL的,用户不能通过非SSL连接访问它。

我find的解决scheme是:

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

请注意,虽然在我的情况下,我服务的是一个页面的JavaScript应用程序,其中所有path都由index.html解决。 如果您的path已经parsing到S3存储桶中的不同对象,则无法工作。

在我的情况下,我使用“path模式”行为的多个来源以及我的S3存储区中的“来源path”:

错误的设置:

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

我的S3来源:原始path: /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它doesn不存在。

删除原始path。

这使我可以访问具有源访问标识和存储区权限以及个人文件许可限制的存储区。