Как я могу ограничить доступ к веб-сайту S3 для Cloudfront? - PullRequest
0 голосов
/ 10 июля 2020

Я хочу разместить 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.

Кто-нибудь знает, что еще я могу попробовать?

...