You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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或实际监听端口匹配
          }
        }
      }
    }
    
  • 添加自定义健康检查(若应用未默认处理/路径):
    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
          }
        }
      }
    }
    
    同时在Golang代码中添加健康检查路由:
    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"]

三、快速验证步骤

  1. 本地用Cloud SQL Auth代理运行应用,确认代码本身可正常连接数据库。
  2. 在GCP控制台查看Cloud Run服务的环境变量,确认数据库信息与连接名正确注入。
  3. 查看Cloud Run日志,获取端口监听或数据库连接的详细错误信息。

内容的提问来源于stack exchange,提问作者squish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:23:10