Amazon s3 AWS CDK CloudFront到S3重定向
我正在使用AWSCDK设置S3和CloudFront静态网站托管。在我想将“http[s]/:www.mydomain.com”重定向到“https://mydomain.com”之前,一切都很好。我不想公开S3存储库,而是想为CloudFront“源访问标识”提供bucket权限。我的CDK代码的相关片段如下: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
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。这使我得出以下结论:
源域名
是可行的,但我不知道这是否是一种“合法”配置,将来可能会更改,在这种情况下,我的代码可能会停止工作。目前的解决办法是:
customOriginSource
将起作用源域名
作为参考,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