Terraform创建GCP负载均衡器对接API网关返回404问题求助
根据你提供的Terraform配置和问题描述,手动创建的LB可正常对接API网关,而Terraform创建的LB返回404,核心问题大概率出在LB配置的细节差异上,以下是具体排查和修正方向:
1. 修正Backend Service的协议配置
你的Backend Service设置了protocol = "HTTPS",但GCP负载均衡器与API Gateway的Serverless NEG通信时,应该使用HTTP协议(LB对外提供HTTPS,内部转发到API Gateway用HTTP)。手动创建的LB大概率是用了HTTP协议,这是导致404的常见原因。
修改google_compute_backend_service.webservers_backend_service_us的protocol字段:
resource "google_compute_backend_service" "webservers_backend_service_us" { # 其他配置保持不变 protocol = "HTTP" # 从HTTPS改为HTTP }
2. 完善URL Map的路径匹配规则
虽然你的URL Map设置了default_service,但显式添加路径规则可以确保所有路径请求都被正确转发,避免因隐式规则差异导致的404。在path_matcher块中添加path_rule:
resource "google_compute_url_map" "lb_us" { name = "url-map-us" provider = google-beta default_service = google_compute_backend_service.webservers_backend_service_us.id host_rule { hosts = [var.domain_name_us] path_matcher = "us-predictions" } path_matcher { name = "us-predictions" default_service = google_compute_backend_service.webservers_backend_service_us.id # 添加显式路径规则 path_rule { paths = ["/*"] service = google_compute_backend_service.webservers_backend_service_us.id } } }
3. 验证Serverless NEG的资源ID正确性
确保serverless_deployment中的resource字段是API Gateway的完整资源ID,格式应为:projects/{你的项目ID}/locations/{地区}/gateways/{网关名称}
检查var.neg_us_id.gateway是否符合这个格式,避免仅传入网关名称导致NEG无法正确关联API Gateway。
4. 检查LB日志定位请求流向
如果以上修改后仍有问题,开启LB的日志(你的配置已开启log_config),查看请求是否到达API Gateway:
- 前往GCP控制台的Cloud Logging,筛选负载均衡器的日志
- 检查请求的
target_backend_service、url_map匹配结果,确认请求是否被正确转发到目标NEG
内容的提问来源于stack exchange,提问作者atefeh

