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

GCP+Terraform部署MySQL后Go程序无法连接数据库求助

GCP Cloud SQL 连接失败排查求助

这是我的第一篇帖子,我正在用Terraform、GCP和MySQL做副业项目,对这些技术完全陌生,若有认知不足提前致歉。我在尝试通过Go应用连接SQL数据库时遇到了错误。

Terraform 实例创建代码

resource "google_sql_database_instance" "instance" {
  name             = "name"
  database_version = "MYSQL_8_0"
  project          = "project_id"
  region           = "us-central1"

  settings {
    tier = "db-f1-micro" # Choose an appropriate machine type
  }
}

resource "google_sql_database" "database" {
  name     = var.db_DSN
  instance = google_sql_database_instance.instance.name
}

resource "google_sql_user" "database_user" {
  name     = var.db_name
  instance = google_sql_database_instance.instance.name
  password = var.db_password
}

Terraform已成功创建实例,但Go应用连接数据库时出错。

Go 连接代码

package main

import (
    "database/sql"
    "fmt"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    host := <public_ip_address> // Public IP Address from the SQL instance on GCP       
    port := 3306       // MySQL default port
    user := "test"       
    password := "test123"   
    dbname := <db_name>    
    sslmode := "disable"              

    // Construct the connection string
    connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", user, password, host, port, dbname)

    fmt.Println(connStr)

    // Open a database connection
    db, err := sql.Open("mysql", connStr)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()

    // Test the connection
    err = db.Ping()
    if err != nil {
        log.Fatal("Database connection failed:", err)
    }

    fmt.Println("Connected to the database!")
}

错误信息

执行go run cmd/main.go后出现以下错误:

Database connection failed:dial tcp <host>:3306: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond

已尝试的操作

  • 改用PostgreSQL,仍出现类似问题
  • 创建新实例、新用户和连接信息
  • 咨询过ChatGPT
  • 配置防火墙规则允许tcp:3306连接,IP范围设置为0.0.0.0/0,连接信息反复核对无误,但问题仍未解决,怀疑遗漏了GCP中的关键基础配置,但无法定位。

排查建议

  1. 检查Cloud SQL公网访问与授权网络

    • 确认实例已分配公网IP:在GCP控制台Cloud SQL实例详情页的「连接」标签下,查看「公网IP」是否启用并分配地址。
    • 补充授权网络配置:Cloud SQL默认拒绝所有外部连接,即使GCP防火墙开放端口也无效。需要在实例的「授权网络」中添加你的本地公网IP或0.0.0.0/0(仅测试用),Terraform代码需补充ip_configuration块:
      resource "google_sql_database_instance" "instance" {
        # 原有配置...
        settings {
          tier = "db-f1-micro"
          ip_configuration {
            ipv4_enabled = true
            authorized_networks {
              value = "0.0.0.0/0"
              name  = "test-allow-all"
            }
          }
        }
      }
      
      执行terraform apply更新配置。
  2. 本地网络连通性测试

    • 用telnet <public_ip> 3306或nc -zv <public_ip> 3306测试端口连通性,若不通,优先排查Cloud SQL授权网络或本地网络防火墙/代理。
    • 若身处国内,需确认是否能正常访问GCP us-central1区域的公网IP。
  3. 修正MySQL连接字符串

    • MySQL 8.0默认强制SSL连接,需在连接字符串中添加SSL参数:
      connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?tls=skip-verify", user, password, host, port, dbname)
      
      或在GCP控制台开启「允许未加密连接」(仅测试用)。
  4. 验证SQL用户权限

    • 确认创建的SQL用户主机为%(允许任意外部IP连接),在GCP控制台Cloud SQL的「用户」标签下可查看或修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:24:53