我正在尝试使用CloudFront从S3存储桶中交付静态资产。正如我最初发现的那样,该存储桶是公共的,并且具有以下公共访问设置:
这是我最初遇到的存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
},
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E3KB5KQ622F9F3"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<BUCKET_NAME>/*"
}]
}
现在这是我所做的:
每当我尝试通过创建的CDN访问静态资源时,访问都会被拒绝。在引用AWS documentation来限制通过CloudFront进行S3存储桶访问时,我特别困惑于他们希望开发人员按照以下说明进行操作:
"To specify an origin access identity, use the value of Amazon S3 Canonical User ID
on the Origin Access Identity page in the CloudFront console."
答案 0 :(得分:0)
为回答为原始访问身份找到Amazon S3规范用户ID的问题,您可以使用控制台浏览到CloudFront->安全->源访问身份。另外,您也可以使用CLI列出
$ aws cloudfront list-cloud-front-origin-access-identities
{
"CloudFrontOriginAccessIdentityList": {
"Items": [
{
"Comment": "access-identity-..... ",
"S3CanonicalUserId": "e9eeea57c92144d.....",
"Id": "XXXXXXXXXXXXX"
}
]
}
}
然后,您可以在问题中使用S3CanonicalUserId值。
有趣的是,如果允许CloudFront为您更新策略,则最终会有些许不同,如果您更新了原始访问身份ID,也可以使用这些东西。
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket-name/*"
}
]
}
问题中的其他所有内容都看起来正确,因此可以完成设置。如果遇到AccessDenied错误,我建议的下一步是创建一个Invalidation(enter link description here),以从CloudFront缓存中删除对象。