Перенаправление AWS CDK CloudFront на S3

Я использую AWS CDK для настройки статического хостинга веб-сайтов S3 и CloudFront. Все работает хорошо, пока я не хочу перенаправить http [s] //: www.mydomain.com на https: //mydomain.com. Я не хочу делать репозитории S3 общедоступными, а просто предоставляю права доступа к корзине для CloudFront Origin Access Identity. Соответствующий фрагмент моего кода CDK выглядит следующим образом:

const wwwbucket = new s3.Bucket(this, "www." + domainName, {
    websiteRedirect: {
    hostName: domainName,
    protocol: s3.RedirectProtocol.HTTPS },
    blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL
})

const oaiWWW = new cloudfront.OriginAccessIdentity(this, 'CloudFront-OriginAccessIdentity-WWW', {
    comment: 'Allows CloudFront to access the bucket'
})
wwwbucket.grantRead(oaiWWW)

const cloudFrontRedirect = new cloudfront.CloudFrontWebDistribution(this, 'https://www.' + domainname + '.com redirect', {
    aliasConfiguration: {
        acmCertRef: certificateArn,
        names: [ "www." + domainName ],
        sslMethod: cloudfront.SSLMethod.SNI,
        securityPolicy: cloudfront.SecurityPolicyProtocol.TLS_V1_1_2016,
    },
    defaultRootObject: "",
    originConfigs: [
        // {
        //   customOriginSource: {
        //     domainName: wwwbucket.bucketWebsiteDomainName
        //   },
        //   behaviors : [ {isDefaultBehavior: true}],
        // },
        {
        s3OriginSource: {
            s3BucketSource: wwwbucket,
            originAccessIdentity: oaiWWW
        },
        behaviors : [ {isDefaultBehavior: true}],
        }
    ]
});

К сожалению, в результате вместо перенаправления переход к www.mydomain.com приводит к тому, что браузер показывает результат списка корзины S3 XML. Я могу исправить проблему вручную, используя консоль AWS для редактирования доменного имени источника CloudFront в настройках источника из:

bucketname.s3.eu-west-2.amazonaws.com

to:

bucketname.s3-website.eu-west-2.amazonaws.com

Дальше все работает как положено. Я попытался изменить свой сценарий CDK, чтобы использовать customOriginSource, а не s3OriginSource (закомментированный код выше), что приводит к правильному адресу в исходном доменном имени CloudFront, но тогда дистрибутив CloudFront не имеет идентификатора Origin Access и поэтому не может получить доступ ковш S3.

Кто-нибудь знает, как выполнить перенаправление без необходимости делать сегмент перенаправления общедоступным или редактировать имя домена источника вручную через консоль AWS?


person Nick Ager    schedule 23.10.2020    source источник


Ответы (1)


Я думал, что нашел ответ, используя аварийный люк CDK. После создания распространения CloudFront для моего перенаправления я изменил CloudFormation JSON за классом CDK как (в машинописном тексте):

type ChangeDomainName = {
    origins: {
      domainName: string
    }[]
}

const cfnCloudFrontRedirect = cloudFrontRedirect.node.defaultChild as cloudfront.CfnDistribution
var distributionConfig = cfnCloudFrontRedirect.distributionConfig as cloudfront.CfnDistribution.DistributionConfigProperty & ChangeDomainName
distributionConfig.origins[0].domainName = wwwbucket.bucketWebsiteDomainName
cfnCloudFrontRedirect.distributionConfig = distributionConfig

К сожалению, хотя это привело к созданию шаблона CloudFormation, к которому я стремился (проверено с помощью cdk synthesize) при развертывании (cdk deploy), CloudFormation сгенерировала следующую ошибку:

UPDATE_FAILED | AWS :: CloudFront :: Распространение | Параметр Origin DomainName не относится к допустимому сегменту S3.

Похоже, что даже если можно установить конечную точку веб-сайта в форме - ${bucketname}.s3-website.${region}.amazonaws.com - вручную в поле Origin Domain Name в консоли CloudFront, это невозможно с помощью CloudFormation. Это подводит меня к выводу:

  1. Это ошибка CloudFormation.
  2. Это ошибка консоли, поскольку консоль не должна допускать такую ​​настройку.

Однако, хотя в настоящее время изменение Origin Domain Name в консоли работает, я не знаю, является ли это законной конфигурацией, которая может быть изменена в будущем, и в этом случае мой код может перестать работать. Текущие решения:

  1. Сделайте сегмент перенаправления общедоступным, и в этом случае customOriginSource будет работать.
  2. Вместо использования корзины перенаправления используйте Lambda для выполнения перенаправления и развертывания в CloudFront с использованием Lambda @ Edge.

Я бы предпочел не делать свой сегмент перенаправления общедоступным, поскольку он приводит к предупреждению при использовании инструментов проверки безопасности. Вариант развертывания Lambda @ Edge с использованием cdk за пределами us-east-1 в настоящее время выглядит болезненным, поэтому пока продолжу редактировать Origin Domain Name вручную в консоли.

Для справки, документация AWS, по-видимому, подразумевает, что API запрещает такое использование, хотя консоль разрешает это, см. Использование корзин Amazon S3, настроенных в качестве конечных точек веб-сайтов для вашего источника. Смотрите также:

person Nick Ager    schedule 28.10.2020
comment
Вы можете установить URL-адрес веб-сайта при использовании customOriginSource вместо s3OriginSource. Также установите originProtocolPolicy на HTTP_ONLY. Итак, полный конфиг: customOriginSource: {originProtocolPolicy: OriginProtocolPolicy.HTTP_ONLY, domainName: wwwBucket.bucketWebsiteDomainName} - person Emilis Panovas; 04.11.2020
comment
@EmilisPanovas Я думал, что связанная корзина должна быть общедоступной при использовании customOriginSource. Так ли это? Я стараюсь избегать публичных корзин, поскольку они генерируют исключения во время аудита безопасности. - person Nick Ager; 05.11.2020
comment
Я работал над этим с тем же намерением - устраняя все нарушения хаба безопасности. Он работает с частным ведром и безопасным обменом данными только с ограничением API. Но URL-адрес веб-сайта отображается только по HTTP и, похоже, остается доступным внутри AWS. Чтобы добавить к этому, я также заметил, что он ломается, если я использую политику управляемого кэширования в поведении. Это исправляет переключение в устаревший режим и разрешение кэширования управления источником. - person Emilis Panovas; 05.11.2020