google-app-engine - 从已部署的应用连接到 Google Cloud SQL 服务器时遇到问题

标签 google-app-engine go google-cloud-sql

我使用的是 Google Cloud SQL 实例(第二代),授权自己的 IP 后可以在本地成功连接到它。我有可以成功从表中检索行的 Go 代码,也有可以成功向表添加行的代码。但是,当我部署应用程序时,该应用程序无法连接到服务器。每当调用 SQL 函数时,服务器都会返回 500 响应。我的应用程序被授权连接到此 SQL 实例:

enter image description here

我正在使用以下 Go 连接代码:

func dialSQL() (*sql.DB, error) {
    if appengine.IsDevAppServer() {
        return sql.Open("mysql", "root:password@tcp(xxx.xxx.xxx.xxx:3306)/Dbname")
    } else {
        return sql.Open("mysql", "root@cloudsql(projectid:regionname:instancename)/Dbname")
    }
}

已部署版本和本地版本使用相同的代码库,但已部署版本使用 dialSQL() 中的第二个连接字符串功能。

我正在使用这个 Go MySQL 驱动程序:https://github.com/go-sql-driver/mysql

此驱动程序的文档提到了以下用于通过 Google App Engine 连接到 Google Cloud SQL 服务器的连接字符串:user@cloudsql(project-id:instance-name)/dbname

我使用的是projectid:regionname:instancename而不是projectid:instancename,因为这篇文章提到需要包含regionname : google app engine golang, driver: bad connection

令人困惑的是,Google 的文档还省略了 regionname : https://cloud.google.com/appengine/docs/go/cloud-sql/reference

我尝试了连接字符串的两种变体。

根据this post ,部署的应用程序将尝试使用 host = localhost 连接到服务器,并根据 this post ,'root'@'localhost' 的密码必须为空。

我在 mysql 控制台中进行了以下查询,以验证用户“root”@“localhost”确实具有空密码:select User, Host, HEX(authentication_string) from mysql.user 。 “root”@“%”用户仍然拥有我在 Google Cloud SQL 实例控制台中指定的密码。

我查看了 possible issue关于 GAE 应用程序和 Cloud SQL Server 的区域,但它们位于同一区域。我还了解到,对于第二代 Google Cloud SQL 服务器,应用程序和服务器的区域允许不同。

我还创建了一个新用户,并尝试使用连接字符串中的新用户用户名连接到实例。这并没有修复错误。

我还尝试添加防火墙规则,但这也没有解决问题:

enter image description here

最后,我转到 Google Cloud Console 的计算引擎部分,并通过 SSH 连接到为我的应用程序的最新实例提供服务的虚拟机。我成功 ping 通 Cloud SQL 服务器的 IP,但是 telnet xxx.xxx.xxx.xxx 3306时间到。我也跑了lsof -i TCP:3306lsof -i | grep 3306但没有出现任何进程。我还在这个盒子上安装了 mysql 并尝试从那里连接到服务器,但连接失败。

有谁知道可能导致此问题的原因吗?

最佳答案

看起来可能有 an issuethe Go MySQL driver当已部署的 Google App Engine 应用程序尝试连接到第二代 Google Cloud SQL Server 时。

我创建了第一代 Cloud SQL 实例,并且能够使用已部署的 Google App Engine 应用程序通过以下连接字符串成功连接到服务器:

user@cloudsql(project-id:instance-name)/dbname

不需要区域名称。

关于google-app-engine - 从已部署的应用连接到 Google Cloud SQL 服务器时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39668672/

相关文章:

php - fatal error : Call to undefined function mysql_connect()

python - 如何从运行在 Google App Engine SDK 上的 Python 应用程序访问本地 MySQL 实例?

go - glog 标志重新定义错误

go - 有没有更好的方法将解压缩的数据读入 slice ?

Go goroutine 泄漏

mysql - 通过多个线程执行多个查询时发生奇怪的连接错误 - Google Cloud SQL

postgresql - 如何强制重启 Cloud SQL

google-app-engine - 在 Google App Engine 中使用相同的项目 ID 部署多个应用程序

iphone - Google App Engine 可用于 "check for updated"并下载二进制文件 Web 服务吗?

python - 在 Google App Engine Python 沙箱中调试