【发布时间】:2020-07-10 10:45:29
【问题描述】:
我想将 Cloudfront CDN 放在静态网站的 S3 website bucket 前面,并将存储桶的读取访问权限限制为 Cloudfront 分发。很常见,documented by AWS 和其他来源。但由于某种原因,我无法让它工作。
我不是第一个偶然发现这一点的人。 (1、2、3)。我已经尝试了那里发布的解决方案,但同样没有运气。
我的设置,作为 Cloudformation 模板,如下所示:
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
s3BucketName:
Type: String
domainName:
Type: String
certificateArn:
Type: String
bucketAuthHeader:
Type: String
Resources:
cloudfrontDistribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
PriceClass: PriceClass_100
Origins:
- Id: !Sub "ID-${s3BucketName}"
DomainName: !Sub "${s3BucketName}.s3-website.eu-central-1.amazonaws.com"
CustomOriginConfig:
OriginProtocolPolicy : http-only
OriginCustomHeaders:
- HeaderName: User-Agent
HeaderValue: !Ref bucketAuthHeader
DefaultCacheBehavior:
AllowedMethods:
- GET
- HEAD
- OPTIONS
CachedMethods:
- GET
- HEAD
- OPTIONS
DefaultTTL: 600
ForwardedValues:
QueryString: false
TargetOriginId: !Sub "ID-${s3BucketName}"
ViewerProtocolPolicy: redirect-to-https
s3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref s3BucketName
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
WebsiteConfiguration:
IndexDocument: index.html
ErrorDocument: _errors/404/index.html
DeletionPolicy: Delete
s3BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref s3BucketName
PolicyDocument:
Version: 2012-10-17
Id: "Cloudfront Bucket Access"
Statement:
- Sid: "Cloudfront Bucket Access via Referer"
Effect: Allow
Principal: "*"
Action: "s3:GetObject"
Resource: !Sub "arn:aws:s3:::${s3BucketName}/*"
Condition:
StringEquals:
aws:UserAgent:
- !Ref bucketAuthHeader
但是,在应用此功能时,我无法通过 Cloudfront 访问文件,总是得到 403。我还尝试调整 PublicAccessBlockConfiguration 和 AccessControl 中的值,并尝试使用 aws s3 sync … --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers 上传存储桶内容。
但我总是以 要么 公共 S3 内容结束,要么 内容也无法通过 Cloudfront 获得。
有人知道我还能尝试什么吗?
【问题讨论】:
-
从 AWS 内部对 S3 存储桶进行基于角色的访问不是一个好的做法。最好对静态网站本身进行一些其他限制。
-
您是否考虑过使用Origin Access Identity 仅允许从 CloudFront 访问您的存储桶?
-
@Nikhil 我们在这里讨论的是 S3 网站 存储桶,因此该链接与此脚本无关。 AWS 自己也明确推荐基于角色的方法,请参阅我的问题中的链接。
-
@Marcin OAI 不适用于 S3 网站 存储桶。
标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-cloudfront