Cloud Run中Golang应用连接Cloud SQL失败:主机名解析错误
问题排查与解决方案
一、Cloud SQL连接失败(hostname解析错误)
1. 确认Cloud SQL连接方式配置
Cloud Run连接Cloud SQL有两种核心方式,对应Terraform配置需严格匹配:
- Cloud SQL Auth代理模式:必须在
google_cloud_run_service中配置cloud_sql_instances参数,值为Cloud SQL实例的完整连接名{project}:{region}:{instance-name},确保和实例控制台显示的连接名完全一致,无拼写错误。 - 私有IP模式:需保证Cloud Run与Cloud SQL在同一VPC网络,Terraform需配置
vpc_connector指向对应VPC连接器,同时Cloud SQL实例已启用私有IP,且连接器权限覆盖该IP段。
2. 修正Golang连接字符串
错误日志显示将Cloud SQL连接名当作域名解析,这是连接方式误用的典型问题:
- Auth代理模式:连接字符串需使用Unix套接字路径,格式为:
postgres://{user}:{password}@/{dbname}?host=/cloudsql/{connection-name} - 私有IP模式:直接使用Cloud SQL的私有IP作为host,格式为:
postgres://{user}:{password}@{private-ip}:5432/{dbname}
3. Terraform配置关键检查点
- 确认Cloud SQL连接名已正确注入环境变量:
env { name = "CLOUD_SQL_CONNECTION_NAME" value = google_sql_database_instance.main.connection_name } - 检查
cloud_sql_instances参数是否配置:cloud_sql_instances = [google_sql_database_instance.main.connection_name] - 若使用VPC连接器,验证
vpc_connector指向正确资源,且网络匹配:vpc_connector = google_vpc_access_connector.main.name
二、Cloud Run修订版本无法就绪(端口未监听)
1. 端口监听代码修正
Cloud Run通过PORT环境变量指定监听端口,代码不能硬编码:
port := os.Getenv("PORT") if port == "" { port = "8080" // 本地测试 fallback } listener, err := net.Listen("tcp", ":"+port)
2. Terraform容器端口与健康检查配置
- 确保容器端口配置和代码监听端口一致:
template { spec { containers { image = "gcr.io/${var.project}/${var.service-name}:latest" ports { container_port = 8080 // 与代码默认PORT或实际监听端口匹配 } } } } - 添加自定义健康检查(若应用未默认处理
/路径):
同时在Golang代码中添加健康检查路由:template { spec { containers { liveness_probe { http_get { path = "/healthz" port = 8080 } initial_delay_seconds = 3 period_seconds = 3 } readiness_probe { http_get { path = "/healthz" port = 8080 } initial_delay_seconds = 3 period_seconds = 3 } } } }http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte("ok")) })
3. Dockerfile配置验证
确保镜像构建时正确暴露端口并执行启动命令:
FROM golang:1.21-alpine AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN go build -o main . FROM alpine:latest WORKDIR /app COPY --from=builder /app/main . EXPOSE 8080 CMD ["./main"]
三、快速验证步骤
- 本地用Cloud SQL Auth代理运行应用,确认代码本身可正常连接数据库。
- 在GCP控制台查看Cloud Run服务的环境变量,确认数据库信息与连接名正确注入。
- 查看Cloud Run日志,获取端口监听或数据库连接的详细错误信息。
内容的提问来源于stack exchange,提问作者squish
相关产品推荐
相关产品推荐

