拒绝 AWS CloudFront 访问 S3 bucket

我试图安装 CloudFront,以服务静态文件托管在我的 S3桶。我有设置分布,但我得到 AccessDenied时,试图浏览到 CSS (/CSS/stlyle.css)文件内的 S3桶:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>E193C9CDF4319589</RequestId>
<HostId>
xbU85maj87/jukYihXnADjXoa4j2AMLFx7t08vtWZ9SRVmU1Ijq6ry2RDAh4G1IGPIeZG9IbFZg=
</HostId>
</Error>

我已经将 CloudFront 发行版设置为 S3存储桶,并创建了新的 Origin Access Identity policy,它是自动添加到 S3存储桶的:

{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E21XQ8NAGWMBQQ"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::myhost.com.cdn/*"
}
]
}

我错过什么了吗?

我希望我在这个 S3桶中的所有文件都通过 CloudFront 提供..。

最新消息

向导说:

默认情况下,Amazon S3 bucket 和其中的所有对象都是私有的,只有创建 bucket 的 AWS 帐户有权读写其中的对象。如果希望允许任何人使用 CloudFront URL 访问 Amazon S3桶中的对象,则必须向对象授予公共读取权限。(这是使用 CloudFront 和 Amazon S3时最常见的错误之一。您必须显式地向 AmazonS3桶中的每个对象授予特权。)

因此,在此基础上,我为 Everyone Read/Download中的 S3 bucket 中的所有对象添加了新的权限。现在我可以访问文件了。

但是现在当我访问像 https://d3u61axijg36on.cloudfront.net/css/style.css这样的文件时,它被重定向到 S3URI 和 HTTP。我要怎么解除这个?

61577 次浏览

为了回答你的问题,我通过以下方式重现了当时的情景:

  • 创建了一个没有桶策略的 亚马逊 S3桶
  • 上传 Public jpg并通过“公开”公开
  • 上传了 二等兵 JPG并保密
  • 创建一个 Amazon CloudFront 网络发布:
    • 起源域名: 从列表中选择了我的 S3桶
    • 限制桶访问:
    • 起源访问身份: 创建一个新的身份
    • 授予对桶的读权限: 是的,更新桶策略

我检查了桶,CloudFront 添加了一个与您类似的桶策略。

分布标记为 In Progress一段时间。当它显示为 Enabled时,我通过 xxx.cloudfront.net的 URL 访问了这些文件:

  • 2我到 S3的网址。是的,我可以看到文件,但它不应该使用重定向。
  • 我也是 xxx.cloudfront.net/private.jpg,但是我接收到了 Access Denied,因为它是 S3中的一个私有文件。

然后我做了一些 研究,发现这是相当常见的事情。有些人使用变通方法,将 CloudFront 发行版指向 静态托管网站的网址,但这有一个缺点,即它不能与 Origin Access Identity 一起工作,而且我怀疑它不会获得“免费的 S3边缘流量”折扣。

我等了一晚上,今早测试了 一切正常

底线: 即使它说 ENABLED,事情可能需要几个小时(如一夜之间)才能恢复正常。然后它将按照文档的形式工作。

在我的案例中,我在 S3桶中使用了“路径模式”行为的多个起源,以及一个起源路径:

错误的设置:

云端行为: - > My-S3-origin

My-S3-起源: 来源地: /images

中三文件: /images/my-image. jpg

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

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

解决方案

移除原产地通道。

我在 Default Root Object中的 CloudFront Distribution Settings的 General tab 下面添加了 index.html,它对我很有用。 因为 index.html 是我的项目的根文件!

不要选择默认的源域名 S3 bucket,请输入 <bucket-name>.s3-website.<region>.amazonaws.com作为源域名(您可以在 S3 bucket 属性下的静态网站托管属性获得此 URL)。

如果您使用的是刚刚创建的 bucket,就会发生这种情况。

根据这里的官方回复: AWS Forun 链接,在创建一个新的 bucket 之后,您必须等待几个小时,然后才能让云前分布正确地处理它。

解决方案是从你的旧桶暂时工作,并切换到新桶几个小时后。

我也从 CloudFront 得到了403,但我的问题有点不同,所以在这里分享它,因为它可能会帮助其他人。

确保你定义为桶策略一部分的起源访问 ID 是正确的:

{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity HERE_GOES_YOUR_ORIGIN_ACCESS_ID"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::deepen-frontend-prod/*"
}
]
}

起源访问身份 ID 大致类似于 E19F48VV5H01ZD。

你可以在一个 https://console.aws.amazon.com/cloudfront/home#oai 上找到你所有的原始访问身份 在 你的身份下的 CloudFront 配置中查找您正在使用的: enter image description here

将此添加到 Bucket 策略中

    {
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ESDK2T2CSNT57"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{Bucket name }/*"
}

让 S3 bucket 中的对象公开读取是实现这一点的最快方法。但是不建议这样做。而是在 S3 orgin 策略下创建一个 origin_access_identity,并使用 bucket 策略将此身份访问权限授予 S3 bucket。这样就可以保持所有对象的私有性。

百分百确定工作解决方案..。

通过增加错误响应规则,只能在 CloudFront 面板上解决。

请看这里的解决方案- 反应路由器不工作在第三个桶

一旦我将 index.html 添加到 CloudFront 分发设置的 General 选项卡下的默认根对象中,它就对我起作用了。

您可以指向 Cloud Front 使用 s3 bucket,或者您可以将 s3 bucket 作为一个静态网站托管,并指向 Cloud Front 一个静态网站 URL。

  1. 当您将 CloudFront 指向 s3 bucket 时

    • 我使用 OAI 作为处方 给你。它为我工作。

enter image description here

enter image description here

enter image description here

  • 但是,请注意,如果不提及根文档,就不能访问根文档。

  • 附加到 url 中,并查看是否可以通过完整的 url 访问任何文档。如果不需要,则主要在 s3 bucket 上检查权限问题。跟随上面的 URL。

  • 你需要提供一个默认的根文档(index.html 或类似的东西)。否则,你的根将被拒绝访问。

  1. 当你想使用 s3的静态网站。不要从可用列表中选择 S3原点。而是复制并粘贴 S3静态根。 在这种情况下,Origin 必须是 bucket 的静态网站托管中给出的确切 URI。 注意,这与创建云前发行版时在选项中给出的非常相似的桶名不同。

在创建一个云前端发行版之前,请确保网站是通过这个 URL 工作的。

enter image description here

作为一个 AWS 新手,我在学习了设置公共 S3 bucket 的教程之后遇到了类似的问题。我希望我的 S3存储桶是私有的,并让 CloudFront 提供这些文件。我设置了一个 OAI 并打开了 封锁所有公共通道,只是在所有 CloudFront URL 上接收到了 AccessDenied错误。

我的问题是,我在 S3 bucket 策略中创建了两个相互冲突的语句: 一个是在我按照本教程设置 public bucket 时创建的, 另一个是在我设置 OAI 并选择 更新桶策略时自动生成的:

{
"Version": "2012-10-17",
"Id": "Policy1620442091089",
"Statement": [
{
"Sid": "Stmt1620442087873",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-s3-bucket/*"
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-s3-bucket/*"
}
]
}

删除 top 语句解决了我的 AccessDenied错误。希望这对 AWS 的新人有所帮助。对我来说,检查相互矛盾的陈述并不是很明显。