使用Terraform配置Cloud Run自定义域名DNS记录报错求助
问题分析
错误原因清晰明确:
- A记录要求
rrdatas必须是IP地址,你填入了带https://的完整URL,完全不符合DNS格式规则 - CNAME记录要求
rrdatas必须是纯域名(不带协议前缀),你同样填入了完整URL,触发格式校验失败 - 额外问题:
google_cloud_run_domain_mapping的depends_on里引用了不存在的google_dns_managed_zone.mahani_website_dns_zone,应改为你定义的google_dns_managed_zone.my_dns_zone
修复方案
1. 修正DNS记录配置逻辑
Cloud Run绑定自定义域名后,Google会自动生成合规的DNS记录值(A/AAAA或CNAME),我们可以直接通过google_cloud_run_domain_mapping资源的输出值自动配置DNS记录,无需手动填写Cloud Run服务URL。
2. 替换错误的Terraform代码片段
删除原有的google_dns_record_set.root_subdomain和google_dns_record_set.www_subdomain,替换为以下代码:
# 从Domain Mapping获取自动生成的DNS记录,批量创建对应Record Set resource "google_dns_record_set" "cloud_run_domain_records" { for_each = { for record in google_cloud_run_domain_mapping.myweb.status[0].resource_records : "${record.name}-${record.type}" => record } name = each.value.name type = each.value.type ttl = 300 managed_zone = google_dns_managed_zone.my_dns_zone.name rrdatas = [each.value.rrdatas] } # 为www子域名创建CNAME指向根域名(可选) resource "google_dns_record_set" "www_subdomain" { name = "www.${local.domain_name}." type = "CNAME" ttl = 300 managed_zone = google_dns_managed_zone.my_dns_zone.name rrdatas = ["${local.domain_name}."] }
3. 修正Domain Mapping的依赖错误
修改google_cloud_run_domain_mapping的depends_on块:
resource "google_cloud_run_domain_mapping" "myweb" { name = local.domain_name location = google_cloud_run_service.mw_cloud_run_svc.location metadata { namespace = data.google_project.my_website.project_id } spec { route_name = google_cloud_run_service.mw_cloud_run_svc.name } depends_on = [ google_dns_managed_zone.my_dns_zone, # 修正为正确的托管区域名称 google_cloud_run_service.mw_cloud_run_svc ] }
4. 额外优化建议
- 移除
required_roles中的roles/owner和roles/domains.admin,这两个权限过大,Cloud Run+DNS配置不需要这么高的权限 - 确保你的域名注册商已将DNS服务器指向Google Cloud DNS托管区域的NS记录,可通过
google_dns_managed_zone.my_dns_zone.name_servers输出获取这些NS地址
验证修复
执行以下命令重新部署:
terraform init terraform plan terraform apply
部署完成后检查DNS记录是否正确生成,等待DNS生效后即可通过自定义域名访问你的Cloud Run服务。
内容的提问来源于stack exchange,提问作者Rodgers Ategyeka
相关产品推荐
相关产品推荐

