AWS CDK CloudFront到S3重定向



我正在使用AWS CDK来设置S3和CloudFront静态网站托管。所有工作都很好,直到我想重定向";http://www.mydomain.com";至";https://mydomain.com";。我不想让S3存储库公开,而是为CloudFront提供bucket权限;原始访问标识";。我的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

至:

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

然后一切如愿以偿。我已经尝试将我的CDK脚本更改为使用CCD_ 2而不是CCD_;原始域名";但是CloudFront分布不具有";起源接入标识";因此无法访问S3存储桶。

是否有人知道一种实现重定向的方法,而不必公开重定向桶或编辑";原始域名";通过AWS控制台手动?

我以为我用CDK逃生舱口找到了答案。在为重定向创建CloudFront分发版后,我将CDK类后面的CloudFormation JSON修改为(在typescript中(:

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

不幸的是,尽管在部署(cdk deploy(时,这似乎生成了我想要的CloudFormation模板(使用cdk synthesize检查(,但CloudFormation生成了以下错误:

UPDATE_FAILED|AWS::CloudFront::分发|参数Origin DomainName未引用有效的S3存储桶。

尽管可以在CloudFront控制台的字段Origin Domain Name中手动设置形式为${bucketname}.s3-website.${region}.amazonaws.com的网站端点,但使用CloudFormation是不可能的。这让我得出结论:

  1. 这是CloudFormation的一个错误
  2. 这是控制台中的一个错误,因为控制台不应该允许这种设置

然而,尽管目前在控制台中修改Origin Domain Name是有效的,但我不知道这是否是一个";合法的";配置,在这种情况下,我的代码可能会停止工作。目前的解决方案是:

  1. 将重定向bucket公开,在这种情况下customOriginSource将起作用
  2. 而不是使用重定向桶,而是使用Lambda来执行重定向;Lambda@Edge&">

我宁愿不公开我的重定向bucket,因为在使用安全检查工具时会导致警告。部署";Lambda@Edge"在us-east-1之外使用cdk目前看起来很痛苦,所以目前我将继续在控制台中手动编辑Origin Domain Name

为了参考,AWS文档似乎暗示API禁止这种使用,尽管控制台允许,请参阅:使用亚马逊S3 Buckets配置为您的来源的网站端点。另请参阅:

  • 网站端点和REST API端点之间的关键差异

最新更新