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中的关键基础配置,但无法定位。
排查建议
检查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更新配置。
本地网络连通性测试
- 用
telnet <public_ip> 3306或nc -zv <public_ip> 3306测试端口连通性,若不通,优先排查Cloud SQL授权网络或本地网络防火墙/代理。 - 若身处国内,需确认是否能正常访问GCP us-central1区域的公网IP。
- 用
修正MySQL连接字符串
- MySQL 8.0默认强制SSL连接,需在连接字符串中添加SSL参数:
或在GCP控制台开启「允许未加密连接」(仅测试用)。connStr := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?tls=skip-verify", user, password, host, port, dbname)
- MySQL 8.0默认强制SSL连接,需在连接字符串中添加SSL参数:
验证SQL用户权限
- 确认创建的SQL用户主机为
%(允许任意外部IP连接),在GCP控制台Cloud SQL的「用户」标签下可查看或修改。
- 确认创建的SQL用户主机为
内容的提问来源于stack exchange,提问作者user23240484
相关产品推荐
相关产品推荐

