GCP Terraform共享VPC下配置forwarding rule报target URL格式错误求助
问题根因
你的报错是两个核心原因共同导致的:
- 负载均衡类型和目标资源不匹配:
google_compute_target_pool仅可用于外部传统网络负载均衡,你配置的load_balancing_scheme = "INTERNAL"属于内部负载均衡,内部负载均衡的目标参数不支持传入target pool的ID/URI。 - 资源所属项目不匹配:你把转发规则、内网IP都创建在了共享VPC的宿主项目(
var.subnetwork_project),但target pool默认创建在当前执行操作的项目,两个资源不在同一个项目下,GCP在宿主项目的转发规则中读取你当前操作项目的target pool资源时无法识别,因此报URL格式错误。
修复方案
根据你的业务需求二选一即可:
方案1:保留内部负载均衡(推荐,符合你当前内网IP的配置逻辑)
内部负载均衡需要用「后端服务(backend service)+ 实例组」替代原有的target pool,GCP要求内部负载均衡必须配置健康检查,修改后的配置示例如下:
# 新增:无托管实例组,收纳你要挂载的业务实例 resource "google_compute_instance_group" "biz_ig" { name = "${var.name}-ig" zone = var.instance_zone # 替换为你的实例所在可用区,多可用区部署请创建多个实例组 instances = var.instances named_port { name = "biz-port" port = var.port_range[0] } } # 新增:健康检查,内部负载均衡强制要求 resource "google_compute_health_check" "lb_hc" { name = "${var.name}-hc" check_interval_sec = 5 timeout_sec = 5 tcp_health_check { port = var.port_range_health[0] != "" ? var.port_range_health[0] : var.port_range[0] } } # 新增:内部负载均衡后端服务 resource "google_compute_backend_service" "lb_be" { name = "${var.name}-backend" load_balancing_scheme = "INTERNAL" region = var.region session_affinity = var.session_affinity backend { group = google_compute_instance_group.biz_ig.self_link } health_checks = [google_compute_health_check.lb_hc.self_link] } # 修改原有的转发规则配置 resource "google_compute_forwarding_rule" "basic_load_balancer" { name = var.name target = google_compute_backend_service.lb_be.self_link # 替换为后端服务的self_link ip_address = google_compute_address.lb_address.address port_range = join(",", var.port_range) labels = var.labels subnetwork = data.google_compute_subnetwork.gcp_subnetwork.self_link # 用self_link替代name,避免跨项目引用错误 project = var.subnetwork_project load_balancing_scheme = var.lb_scheme region = var.region # 补充和其他资源一致的区域参数 }
方案2:改用外部传统负载均衡,保留target pool
如果你确实需要使用target pool,需要调整负载均衡类型,同时统一资源所属项目:
- 把
var.lb_scheme的值改为EXTERNAL - 给target pool资源新增
project参数,和转发规则保持同项目:
resource "google_compute_target_pool" "target_pool" { project = var.subnetwork_project # 新增行,指定创建在共享VPC宿主项目 name = "${var.name}-pool" instances = var.instances session_affinity = var.session_affinity region = var.region # 补充和转发规则一致的区域参数 }
注意事项
- 跨共享VPC引用资源时优先使用
self_link属性而非资源名,避免GCP识别资源所属项目出错 - 所有区域级资源(转发规则、IP、后端服务、target pool)的
region参数必须完全一致 - target pool仅支持外部传统网络负载均衡,其他类型负载均衡均不可使用该资源
内容的提问来源于stack exchange,提问作者DavisTasar
相关产品推荐
相关产品推荐

