无法从已部署的应用

时间:2016-09-23 20:00:44

标签: 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 Server:user@cloudsql(project-id:instance-name)/dbname

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

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

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

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

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

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

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

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

enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

不需要地区名称。

答案 1 :(得分:0)

谷歌提供的连接到第二代的解决方案在这里: "TLS requested but server does not support TLS" error with Google Cloud SQL (2nd generation) from Google App Engine?

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