连接到谷歌SQL云第二代与Go on AppEngine



我在这里看到过其他有同样问题的帖子,但是没有一个答案可以帮助我的情况。我有一个谷歌SQLCloud第二代数据库,我正试图让我的Go应用引擎应用程序建立连接。我使用go-sql-driver/mysql

起初,我试图用与第一代相同的方式连接,只是传递项目和实例名称作为参数:

sql.Open("mysql", "root@cloudsql(project:instance)/database"

然后我注意到从云控制台和这篇文章中,区域也是必需的,所以我的连接参数现在看起来像:

sql.Open("mysql", "root@cloudsql(project:uscentral1:instance)/database"

和密码

sql.Open("mysql", "root:password@cloudsql(project:uscentral1:instance)/database"

仍然不工作

我的最后一次尝试是使用SSL连接,正如这篇文章所描述的那样,使用驱动程序文档中提供的代码:

    rootCertPool := x509.NewCertPool()
    pem, err := ioutil.ReadFile("/path/ca-cert.pem")
    if err != nil {
        log.Fatal(err)
    }
    if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
        log.Fatal("Failed to append PEM.")
    }
    clientCert := make([]tls.Certificate, 0, 1)
    certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem")
    if err != nil {
        log.Fatal(err)
    }
    clientCert = append(clientCert, certs)
    mysql.RegisterTLSConfig("custom", &tls.Config{
        RootCAs: rootCertPool,
        Certificates: clientCert,
    })
    sql.Open("mysql","root:password@cloudsql(project:uscentral1:instance)/database?tls=custom")

也没有运气

在这一点上,我只是不知道问题可能是什么。为了让它工作,有没有人做过与大多数人不同的事情?在这一点上,我不确定问题是否与我的代码,驱动程序或一些配置在CloudSQL数据库。

请将下面的工作示例与您的应用程序中的示例进行比较。将INSTANCE_CONNECTION_NAME替换为Cloud Console或gcloud sql describe中显示的"实例连接名称"。如果你没有注意到你的应用有什么不同,试着运行这个例子,看看你会得到什么错误。

package hello
import (
        "database/sql"
        "fmt"
        _ "github.com/go-sql-driver/mysql"
        "net/http"
)
func init() {
        http.HandleFunc("/", handler)
}
func handler(w http.ResponseWriter, r *http.Request) {
        db, err := sql.Open("mysql", "root@cloudsql(INSTANCE_CONNECTION_NAME)/mysql")
        if err != nil {
                fmt.Fprintf(w, "Error constructing DB: %v", err)
                return
        }
        rows, err := db.Query("SELECT 1")
        if err != nil {
                fmt.Fprintf(w, "Error performing query: %v", err)
                return
        }
        fmt.Fprintf(w, "Success!")
        rows.Close()
}

原来我的项目没有AppEngine的默认凭据。控制台中的文档显示,在创建项目时,默认会创建AppEngine和Compute Engine的默认凭据,但这个项目是在一段时间前通过旧应用引擎控制台创建的,我的假设是,当谷歌将AppEngine项目迁移到新架构时,它没有像我们现在创建新项目时那样创建默认凭据。我已经删除了旧的项目,并创建了一个新的,一切都很好。我想为旧项目创建正确的证书也会起作用。我在这里留下这个答案,因为我只是依赖于文档,实际上花了很多时间在检查明显的之前。这可能是一个很好的建议,让谷歌云文档的家伙在某个地方记录下来。

最新更新