Amazon s3 AWS CDK CloudFront到S3重定向

Amazon s3 AWS CDK CloudFront到S3重定向,amazon-s3,amazon-cloudfront,aws-cdk,Amazon S3,Amazon Cloudfront,Aws Cdk,我正在使用AWSCDK设置S3和CloudFront静态网站托管。在我想将“http[s]/:www.mydomain.com”重定向到“https://mydomain.com”之前,一切都很好。我不想公开S3存储库,而是想为CloudFront“源访问标识”提供bucket权限。我的CDK代码的相关片段如下: const wwwbucket=new s3.Bucket(这个“www.”+域名{ 网站重定向:{ 主机名:域名, 协议:s3.RedirectProtocol.HTTPS}, bl

我正在使用AWSCDK设置S3和CloudFront静态网站托管。在我想将“http[s]/:www.mydomain.com”重定向到“https://mydomain.com”之前,一切都很好。我不想公开S3存储库,而是想为CloudFront“源访问标识”提供bucket权限。我的CDK代码的相关片段如下:

const wwwbucket=new s3.Bucket(这个“www.”+域名{
网站重定向:{
主机名:域名,
协议:s3.RedirectProtocol.HTTPS},
blockPublicAccess:s3.blockPublicAccess.BLOCK_ALL
})
const OAIWW=new cloudfront.OriginAccessIdentity(这是“cloudfront OriginAccessIdentity WWW”{
注释:“允许CloudFront访问存储桶”
})
Grantrade(OAIWW)
const cloudFrontRedirect=new cloudfront.CloudFrontWebDistribution(这个,'https://www.“+domainname+”.com重定向”{
别名配置:{
acmCertRef:certificateArn,
名称:[“www.”+域名],
sslMethod:cloudfront.sslMethod.SNI,
安全政策:cloudfront.SecurityPolicyProtocol.TLS_V1_2016,
},
defaultRootObject:“”,
原始配置:[
// {
//customOriginSource:{
//域名:wwwbucket.bucketWebsiteDomainName
//   },
//行为:[{isDefaultBehavior:true}],
// },
{
s3OriginSource:{
s3BucketSource:wwwbucket,
originAccessIdentity:OAIWW
},
行为:[{isDefaultBehavior:true}],
}
]
});
不幸的是,结果不是重定向,而是浏览
www.mydomain.com
会在浏览器中显示S3XML存储桶列表结果。我可以通过使用AWS控制台在“源站设置”中编辑CloudFront的“源站域名”手动修复此问题:

致:

然后一切都按预期进行。我尝试将我的CDK脚本更改为使用
customOriginSource
而不是
s3OriginSource
(上面注释掉的代码),这会在CloudFront的“源域名”中找到正确的地址,但是CloudFront发行版没有“源访问标识”,因此无法访问S3存储桶


有没有人知道一种实现重定向的方法,而不必公开重定向bucket或通过AWS控制台手动编辑“源域名”?

我想我已经找到了一个答案。在为重定向创建CloudFront发行版之后,我将CDK类后面的CloudFormation JSON修改为(在typescript中):

类型ChangeDomainName={
起源:{
域名:字符串
}[]
}
const cfnCloudFrontRedirect=cloudFrontRedirect.node.defaultChild作为cloudfront.CfnDistribution
var distributionConfig=cfnCloudFrontRedirect.distributionConfig as cloudfront.CfnDistribution.DistributionConfigProperty&ChangeDomainName
distributionConfig.origins[0]。域名=wwwbucket.bucketWebsiteDomainName
cfnCloudFrontRedirect.distributionConfig=distributionConfig
不幸的是,尽管在部署(
cdk-deploy
)时,这似乎生成了我想要的CloudFormation模板(使用
cdk-synthetic
)但CloudFormation生成了以下错误:

更新失败| AWS::CloudFront::分发| 参数Origin DomainName未引用有效的S3存储桶

看起来,即使可以在CloudFront控制台内的
Origin Domain Name
字段中手动设置表单-
${bucketname}.s3 website.${region}.amazonaws.com
的网站端点,也不可能使用CloudFormation。这使我得出以下结论:

  • 这是一个云结构的bug
  • 这是控制台中的一个bug,因为控制台不允许这种设置
  • 然而,尽管目前在控制台中修改
    源域名
    是可行的,但我不知道这是否是一种“合法”配置,将来可能会更改,在这种情况下,我的代码可能会停止工作。目前的解决办法是:

  • 将重定向存储桶公开,在这种情况下,
    customOriginSource
    将起作用
  • 与其使用重定向bucket,不如使用Lambda在中执行重定向和部署
  • 我不想公开我的重定向桶,因为它会在使用安全检查工具时导致警告。“部署”的选项Lambda@Edge“在us-east-1之外使用cdk目前看起来是这样,我将继续在控制台中手动编辑
    源域名

    作为参考,AWS文档似乎暗示API禁止此使用,尽管控制台允许,请参阅:。另见:


    您可以在使用
    customOriginSource
    而不是
    s3OriginSource
    时设置网站url。另外,将
    originProtocolPolicy
    设置为
    HTTP\u ONLY
    。所以完整配置:
    customOriginSource:{originProtocolPolicy:originProtocolPolicy.HTTP\u ONLY,域名:wwbucket.bucketWebsiteDomainName}
    @EmilisPanovas我认为在使用
    customOriginSource
    时,关联的bucket需要是公共的。是这样吗?我正试图避免使用公共存储桶,因为它们在安全审核期间会生成异常。我在这方面的工作目的是相同的——清除所有违反安全中心的行为。它适用于私有bucket和仅限安全通信的api限制。但网站URL仅在HTTP上公开,而且似乎在AWS中仍然可以访问。除此之外,我还注意到,如果在“行为”中使用托管缓存策略,则会出现问题。切换到传统模式并让源控制缓存修复它。
    bucketname.s3.eu-west-2.amazonaws.com
    
    bucketname.s3-website.eu-west-2.amazonaws.com