Я хочу разместить CDN Cloudfront перед корзиной веб-сайта S3 для веб-сайта stati c и ограничить доступ для чтения корзины для распространения Cloudfront. Довольно часто и задокументировано 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
.
Но я всегда получаю либо publi c контент S3, или контент также недоступен через Cloudfront.
Кто-нибудь знает, что еще я могу попробовать?