【问题标题】:Connect to Google SQL Cloud 2nd generation with Go on AppEngine在 AppEngine 上使用 Go 连接到 Google SQL Cloud 第二代
【发布时间】:2017-02-22 13:33:16
【问题描述】:

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

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

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

然后我从 Cloud Console 和 this post 注意到该区域也是必需的,因此我的连接参数现在如下所示:

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

还有密码

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

还是不行

我最后一次尝试是使用驱动程序文档中提供的代码,如this post 所述,使用 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 数据库中的某些配置上。

【问题讨论】:

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


    【解决方案1】:

    请采用以下工作示例并将其与您的应用程序中的内容进行比较。将 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()
    }
    

    【讨论】:

    • 感谢@Vadim。请看我上面的回答。
    【解决方案2】:

    原来我的项目没有 AppEngine 的默认凭据。控制台中的文档说,在创建项目时,默认情况下会创建 AppEngine 和 Compute Engine 的默认凭据,但是这个项目特别是不久前通过旧 App Engine 控制台创建的,我的假设是当 Google 迁移 AppEngine项目到新架构上,它没有像我们现在创建新项目时那样创建默认凭据。 我删除了旧项目并创建了一个新项目,一切正常。我想为旧项目创建正确的凭据也可以。 我把这个答案留在这里是因为我只是依赖文档,实际上在检查明显之前花了很多时间。对 Google Cloud Doc 人员来说,在某处记录此内容可能是一个不错的建议。

    【讨论】:

      猜你喜欢
      • 2016-04-28
      • 2017-10-20
      • 1970-01-01
      • 2016-08-21
      • 2014-02-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2023-03-15
      相关资源
      最近更新 更多