Terraform整合S3网站重定向与CloudFront时的错误排查
CloudFront引用S3网站托管端点的问题解决
问题描述
使用aws_s3_bucket_website_configuration配置S3网站重定向后,在aws_cloudfront_distribution的origin块中引用该资源时触发以下错误:
Error: creating CloudFront Distribution: operation error CloudFront: CreateDistributionWithTags, https response error StatusCode: 400, RequestID: 123456789, InvalidArgument: The parameter Origin DomainName does not refer to a valid S3 bucket.
将domain_name改为aws_s3_bucket.cf_s3_bucket.bucket_regional_domain_name后无报错,但CloudFront控制台提示「该S3已启用静态网站托管,建议使用S3网站端点而非存储桶端点」,且浏览器访问出现Access Denied,必须手动修改Origin域名才能正常重定向。
疑问:能否直接使用domain_name = aws_s3_bucket_website_configuration.cf_s3_bucket.website_endpoint?若不能,如何获取origin块中正确的domain_name值?
解决方案
不能直接使用
website_endpoint,因为该属性返回的是带http://前缀的完整URL,而CloudFront的domain_name要求是不带协议的纯域名,直接引用会触发参数无效错误。正确的取值是
aws_s3_bucket_website_configuration资源的website_domain属性,该值为不带协议的S3网站端点域名,完全符合CloudFront的参数要求。
示例代码
resource "aws_cloudfront_distribution" "cf_distribution" { # 其他必填配置(如默认缓存行为、价格类等) origin { domain_name = aws_s3_bucket_website_configuration.cf_s3_bucket.website_domain origin_id = "S3-Website-Origin" # 搭配Origin Access Control(OAC)实现安全访问 origin_access_control_id = aws_cloudfront_origin_access_control.s3_oac.id } } # 配套的Origin Access Control配置 resource "aws_cloudfront_origin_access_control" "s3_oac" { name = "s3-website-oac" description = "OAC for S3 website origin" origin_access_control_origin_type = "s3" signing_behavior = "always" signing_protocol = "sigv4" }
额外注意事项
- 使用S3网站端点作为CloudFront源时,不能使用Origin Access Identity(OAI),必须改用Origin Access Control(OAC),同时需要配置S3桶策略允许OAC的访问请求。
- 确保S3桶的块公共访问设置中,解除对静态网站托管必要的限制(如允许公共访问),否则会出现
Access Denied错误。 - 验证S3的网站重定向规则配置正确,CloudFront的缓存行为需允许对应的HTTP方法(如GET、HEAD)。
内容的提问来源于stack exchange,提问作者Brian G
相关产品推荐
相关产品推荐

