Terraform部署Cloud Run Direct VPC时提示VPC IP不足及相关疑问
问题原因分析
1. IP不足提示大概率是健康检查失败的连带误报
你的子网配置10.2.0.0/20包含4091个可用IP,完全满足Cloud Run实例的IP需求。错误中的IP不足提示实际是实例启动失败触发的附带错误,核心问题是健康检查未通过,可能的原因包括:
- 服务账号缺少
roles/compute.networkUser权限,无法在子网中创建网络接口 - 防火墙规则未放行Google健康检查IP段对实例8080端口的访问
- 虽然使用了官方hello镜像,但容器内部服务未正常监听8080端口(概率较低)
2. 失败修订版本被自动清理
控制台看不到报错中的deployed-run-00032-bmj版本,是因为Cloud Run会自动删除启动失败的临时修订版本,仅保留成功部署的版本,而Terraform会捕获部署过程中的瞬时错误。
3. Terraform持续报错的逻辑
即使控制台收到updateService事件,Terraform默认会等待服务进入稳定状态(所有修订版本就绪、流量正常路由),只要部署流程中出现健康检查失败,就会判定操作失败。
解决方法
一、修复部署核心问题(优先方案)
- 给服务账号添加VPC访问权限
为google_service_account.eventarc账号授予roles/compute.networkUser角色,允许其在目标子网中创建网络接口:resource "google_project_iam_member" "cloud_run_network_user" { project = data.google_project.project.project_id role = "roles/compute.networkUser" member = "serviceAccount:${google_service_account.eventarc.email}" } - 配置防火墙规则
确保子网关联的防火墙规则允许Google健康检查IP段访问实例8080端口:- 源IP段:
130.211.0.0/22、35.191.0.0/16 - 目标:子网IP范围
10.2.0.0/20 - 协议端口:TCP:8080
- 源IP段:
二、让Terraform忽略部署状态(临时方案)
如果需要跳过Terraform对部署状态的检查,可以在google_cloud_run_v2_service资源中添加wait_for_steady_state = false参数,Terraform仅提交更新请求,不再等待部署完成:
resource "google_cloud_run_v2_service" "file_ingestor" { project = data.google_project.project.project_id name = "cloudrun" location = "us-central1" # 添加该参数跳过状态等待 wait_for_steady_state = false template { max_instance_request_concurrency = 2 containers { image = "us-docker.pkg.dev/cloudrun/container/hello" resources { limits = { cpu = "4" memory = "2048Mi" } } } service_account = google_service_account.eventarc.email vpc_access { network_interfaces { network = google_compute_network.private_network.name subnetwork = google_compute_subnetwork.custom_test.name } } } lifecycle { ignore_changes = [ client, client_version, labels["commit-sha"], labels["managed-by"], template[0].labels["commit-sha"], template[0].labels["managed-by"], template[0].containers[0].image, ] } }
注意:此方案仅让Terraform不等待部署结果,实际部署是否成功需要自行在控制台验证,不推荐作为长期解决方案。
内容的提问来源于stack exchange,提问作者n_prime
相关产品推荐
相关产品推荐

