无法从部署的应用程序连接到 Google 云 SQL 服务器

Trouble connecting to Google Cloud SQL server from deployed app

我用的是Google云SQL实例(二代),授权自己的IP后本地连接成功。我有成功从表中检索行的 Go 代码,我有成功向表添加行的代码。但是,当我部署我的应用程序时,该应用程序无法连接到服务器。任何时候调用 SQL 函数,服务器都会 returns 500 响应。我的应用已获授权连接到此 sql 实例:

我正在使用以下 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 因为这个 post 提到需要包含 regionname:

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

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

根据this post, the deployed app will attempt to connect to the server using host = localhost, and according to this post,'root'@'localhost' 的密码必须为空。

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

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

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

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

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

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

当已部署的 Google App Engine 应用程序尝试连接到 第二代[时,看起来可能 an issue with the Go MySQL driver =25=] Google 云 SQL 服务器.

我创建了一个 第一代 云 SQL 实例,我能够使用已部署的服务器成功连接到服务器Google 具有此连接字符串的 App Engine 应用程序:

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

不需要区域名称。

伙计们,Google 提供了连接到第 2 代的解决方案:

Google 发布的文档是(也许现在仍然是)错误的,但正确的解决方案已发布在那里。 我们在生产中使用第二代云 SQL 没有问题。