CloudFront и версионность S3

Я искал варианты, как обслуживать определенные версии объектов на версионированном ведре S3 с помощью CloudFront. После некоторого копания оказалось, что это довольно просто. Как описано в документации S3 по извлечению версий, конкретная версия может быть извлечена из S3 путем добавления ?version={version} к url. При настройке CloudFront вы также должны разрешить versionId как параметр строки запроса в настройках кэша, чтобы он был передан в S3 Origin. После того, как это будет сделано, и вы попытаетесь получить определенную версию, вы получите ошибку с отказом в разрешении. Чтобы решить эту проблему, вы должны дать CloudFront s3:GetObjectVersion разрешение на ваш S3 bucket в политике.

Полный пример в CloudFormation:

Resources:
  S3:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub '${AWS::StackName}-assets'
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      VersioningConfiguration:
        Status: Enabled
  CloudFrontOriginAccessIdentity:
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: !Sub '${AWS::StackName}'
  S3Policy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3
      PolicyDocument:
        Statement:
          - Sid: CloudFront
            Action:
              - 's3:GetObject'
              - 's3:GetObjectVersion'
            Effect: Allow
            Resource: { 'Fn::Join': [ '/', [ !GetAtt S3.Arn , '*' ] ] }
            Principal:
              AWS: { 'Fn::Join': [ ' ', [ 'arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity', { Ref: CloudFrontOriginAccessIdentity } ] ] }
  CloudFront:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        IPV6Enabled: true
        Enabled: true
        Comment: !Sub '${AWS::StackName}'
        Origins:
          - Id: S3
            DomainName: !GetAtt S3.DomainName
            S3OriginConfig:
              OriginAccessIdentity: { 'Fn::Join': [ '/', [ 'origin-access-identity', 'cloudfront', { Ref: CloudFrontOriginAccessIdentity } ] ] }
        DefaultCacheBehavior:
          AllowedMethods: [ HEAD, OPTIONS, GET ]
          CachedMethods: [ HEAD, OPTIONS, GET ]
          ForwardedValues:
            QueryString: true
            QueryStringCacheKeys: [ versionId ]
          TargetOriginId: S3
          ViewerProtocolPolicy: https-only
          Compress: true

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь вы можете получить последнюю версию вашего актива с помощью доступа:

https://xyz.cloudfront.net/some_image.jpg
Войти в полноэкранный режим Выйти из полноэкранного режима

и вы можете запросить конкретную версию следующим образом:

https://xyz.cloudfront.net/some_image.jpg?versionId=abcdef
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь у вас есть преимущества сервера версионного контента через CloudFront, а также возможность ограничить доступ к вашему контенту с помощью подписанных cookies или подписанных url.

Оцените статью
devanswers.ru
Добавить комментарий