AWS CloudFront 对 S3 存储桶的访问被拒绝
AWS CloudFront access denied to S3 bucket
我正在尝试设置 CloudFront
以提供托管在我的 S3
存储桶中的静态文件。我有设置分发但是我在尝试浏览到 S3 存储桶中的 CSS (/CSS/stlyle.css
) 文件时得到 AccessDenied
:
<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/*"
}
]
}
我是不是漏掉了什么?
我希望通过 CloudFront 提供此 S3 存储桶中的所有文件...
*** 更新 ***
这个云前面 guide 说:
默认情况下,您的 Amazon S3 存储桶和其中的所有对象都是私有的——只有创建该存储桶的 AWS 账户才有权读取或写入其中的对象。如果您想允许任何人使用 CloudFront URL 访问您的 Amazon S3 存储桶中的对象,您必须授予对象的 public 读取权限。 (这是使用 CloudFront 和 Amazon S3 时最常见的错误之一。您必须为 Amazon S3 存储桶中的每个对象明确授予权限。)
因此,基于此,我向 Everyone Read/Download
添加了对 S3 存储桶内所有对象的新权限。现在我可以访问文件了。
但是现在当我访问像 https://d3u61axijg36on.cloudfront.net/css/style.css
这样的文件时,它被重定向到 S3 URI 和 HTTP
。我该如何禁用它?
为了帮助解决您的问题,我通过以下方式重现了这种情况:
- 创建了一个 Amazon S3 存储桶,没有存储桶策略
- 已上传 public.jpg 并通过 "Make Public"
使其成为 public
- 已上传 private.jpg 并将其保密
- 创建了一个 Amazon CloudFront 网络分配:
- 源域名: 从列表中选择了我的 S3 存储桶
- 限制存储桶访问:是
- 源访问身份:创建新身份
- 授予对存储桶的读取权限:是,更新存储桶策略
我检查了存储桶,CloudFront 添加了一个类似于您的存储桶策略。
分配有一段时间被标记为In Progress
。一旦它说 Enabled
,我通过 xxx.cloudfront.net
URL:
访问了文件
xxx.cloudfront.net/public.jpg
将我重定向 到 S3 URL http://bucketname.s3.amazonaws.com/public.jpg
。是的,我可以看到该文件,但它不应该使用重定向。
xxx.cloudfront.net/private.jpg
redirected 我也是,但是我收到了 Access Denied
因为它是 S3 中的私有文件。
然后我做了一些research,发现这是很常见的事情。有些人通过将他们的 CloudFront 分配指向 静态托管网站 URL 来使用变通方法,但这有一个缺点,即它不能与 Origin Access Identity 一起使用,我也怀疑它不会获得 'free S3 traffic to the edge' 折扣。
所以,我等了一夜,今天早上测试了一下,一切正常。
底线: 即使上面写着 ENABLED
,事情也可能需要几个小时(例如一整夜)才能恢复正常。然后它将按照记录工作。
在我的例子中,我在我的 S3 存储桶中使用了具有 "Path Pattern" 行为的多个来源以及一个来源路径:
设置错误:
CloudFront 行为:
/images/*
-> My-S3-origin
我的 S3 来源:
原始路径:/images
S3 文件:
/images/my-image.jpg
获取请求:
/images/my-image.jpg -> 403
发生的事情是整个 CloudFront GET 请求被发送到源:/image/my-image.jpg
以源路径为前缀:/images
,因此进入 S3 的请求看起来像 /images/images/my-image.jpg
,但没有不存在。
解决方案
删除原始路径。
我在 cloudFront Distribution Settings
的“常规”选项卡下的 Default Root Object
中添加了 index.html
,它对我有用。
因为 index.html 是我项目的根文件!
不要为源域名选择默认的 s3 存储桶,请输入 <bucket-name>.s3-website.<region>.amazonaws.com
作为源域名(您可以在 Static 获取 URL S3 存储桶属性下的网站托管 属性。
如果您使用的是刚刚创建的存储桶,就会发生这种情况。
根据此处的官方回复:AWS Forun link,您必须在创建新存储桶后等待几个小时,然后才能让云前端分发正常工作。
解决方案是暂时使用您的旧存储桶之一,并在几个小时后切换到新存储桶。
我也从 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 上找到您所有的源访问身份
在 Your Identities 下的 CloudFront 配置中查找您正在使用的那个:
在存储桶策略中添加这个
{
"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 存储桶中创建对象 public-read 是实现此目的的最快方法。但是,不建议这样做。而是在 s3 源策略下创建一个 origin_access_identity
,并使用存储桶策略授予此身份对 S3 存储桶的访问权限。这样您就可以将所有对象保密。
查看 100% 工作解决方案...
只能在cloudFront面板添加错误响应规则解决
在此处查看解决方案 -
将 index.html 添加到 cloudFront 分发设置的常规选项卡下的默认根对象后,它对我有用。
我正在尝试设置 CloudFront
以提供托管在我的 S3
存储桶中的静态文件。我有设置分发但是我在尝试浏览到 S3 存储桶中的 CSS (/CSS/stlyle.css
) 文件时得到 AccessDenied
:
<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/*"
}
]
}
我是不是漏掉了什么?
我希望通过 CloudFront 提供此 S3 存储桶中的所有文件...
*** 更新 ***
这个云前面 guide 说:
默认情况下,您的 Amazon S3 存储桶和其中的所有对象都是私有的——只有创建该存储桶的 AWS 账户才有权读取或写入其中的对象。如果您想允许任何人使用 CloudFront URL 访问您的 Amazon S3 存储桶中的对象,您必须授予对象的 public 读取权限。 (这是使用 CloudFront 和 Amazon S3 时最常见的错误之一。您必须为 Amazon S3 存储桶中的每个对象明确授予权限。)
因此,基于此,我向 Everyone Read/Download
添加了对 S3 存储桶内所有对象的新权限。现在我可以访问文件了。
但是现在当我访问像 https://d3u61axijg36on.cloudfront.net/css/style.css
这样的文件时,它被重定向到 S3 URI 和 HTTP
。我该如何禁用它?
为了帮助解决您的问题,我通过以下方式重现了这种情况:
- 创建了一个 Amazon S3 存储桶,没有存储桶策略
- 已上传 public.jpg 并通过 "Make Public" 使其成为 public
- 已上传 private.jpg 并将其保密
- 创建了一个 Amazon CloudFront 网络分配:
- 源域名: 从列表中选择了我的 S3 存储桶
- 限制存储桶访问:是
- 源访问身份:创建新身份
- 授予对存储桶的读取权限:是,更新存储桶策略
我检查了存储桶,CloudFront 添加了一个类似于您的存储桶策略。
分配有一段时间被标记为In Progress
。一旦它说 Enabled
,我通过 xxx.cloudfront.net
URL:
xxx.cloudfront.net/public.jpg
将我重定向 到 S3 URLhttp://bucketname.s3.amazonaws.com/public.jpg
。是的,我可以看到该文件,但它不应该使用重定向。xxx.cloudfront.net/private.jpg
redirected 我也是,但是我收到了Access Denied
因为它是 S3 中的私有文件。
然后我做了一些research,发现这是很常见的事情。有些人通过将他们的 CloudFront 分配指向 静态托管网站 URL 来使用变通方法,但这有一个缺点,即它不能与 Origin Access Identity 一起使用,我也怀疑它不会获得 'free S3 traffic to the edge' 折扣。
所以,我等了一夜,今天早上测试了一下,一切正常。
底线: 即使上面写着 ENABLED
,事情也可能需要几个小时(例如一整夜)才能恢复正常。然后它将按照记录工作。
在我的例子中,我在我的 S3 存储桶中使用了具有 "Path Pattern" 行为的多个来源以及一个来源路径:
设置错误:
CloudFront 行为:
/images/*
-> My-S3-origin
我的 S3 来源:
原始路径:/images
S3 文件: /images/my-image.jpg
获取请求: /images/my-image.jpg -> 403
发生的事情是整个 CloudFront GET 请求被发送到源:/image/my-image.jpg
以源路径为前缀:/images
,因此进入 S3 的请求看起来像 /images/images/my-image.jpg
,但没有不存在。
解决方案
删除原始路径。
我在 cloudFront Distribution Settings
的“常规”选项卡下的 Default Root Object
中添加了 index.html
,它对我有用。
因为 index.html 是我项目的根文件!
不要为源域名选择默认的 s3 存储桶,请输入 <bucket-name>.s3-website.<region>.amazonaws.com
作为源域名(您可以在 Static 获取 URL S3 存储桶属性下的网站托管 属性。
如果您使用的是刚刚创建的存储桶,就会发生这种情况。
根据此处的官方回复:AWS Forun link,您必须在创建新存储桶后等待几个小时,然后才能让云前端分发正常工作。
解决方案是暂时使用您的旧存储桶之一,并在几个小时后切换到新存储桶。
我也从 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 上找到您所有的源访问身份
在 Your Identities 下的 CloudFront 配置中查找您正在使用的那个:
在存储桶策略中添加这个
{
"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 存储桶中创建对象 public-read 是实现此目的的最快方法。但是,不建议这样做。而是在 s3 源策略下创建一个 origin_access_identity
,并使用存储桶策略授予此身份对 S3 存储桶的访问权限。这样您就可以将所有对象保密。
查看 100% 工作解决方案...
只能在cloudFront面板添加错误响应规则解决
在此处查看解决方案 -
将 index.html 添加到 cloudFront 分发设置的常规选项卡下的默认根对象后,它对我有用。