Подключитесь к Google SQL Cloud 2-го поколения с помощью Go on AppEngine

Я видел другие сообщения с той же проблемой здесь, однако ни один из ответов не мог помочь в моем случае. У меня есть база данных Google SQLCloud 2-го поколения, к которой я пытаюсь подключить свое приложение Go Appengine. Я использую go-sql-driver/mysql

Сначала я попытался подключиться так же, как и с 1-м поколением, просто передав имена проекта и экземпляра в качестве параметров:

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.


person Jose Bagatelli    schedule 13.10.2016    source источник


Ответы (2)


Пожалуйста, возьмите следующий рабочий пример и сравните его с тем, что есть в вашем приложении. Замените 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()
}
person Vadim    schedule 16.10.2016
comment
Спасибо @Вадим. Пожалуйста, смотрите мой ответ выше. - person Jose Bagatelli; 27.10.2016

Оказывается, у моего проекта не было учетных данных по умолчанию для AppEngine. В документации в консоли говорится, что при создании проекта учетные данные по умолчанию для AppEngine и Compute Engine будут созданы по умолчанию, однако этот проект, в частности, был создан некоторое время назад через консоль Old App Engine, и я предполагаю, что когда Google перенес AppEngine проекты на новую архитектуру, он не создал учетные данные по умолчанию, как это делается сейчас, когда мы создаем новый проект. Я удалил старый проект и создал новый, и все работает нормально. Я полагаю, создание правильных учетных данных для старого проекта также сработает. Я оставляю этот ответ здесь, потому что я просто полагался на документацию и на самом деле потратил много времени на это, прежде чем проверить очевидное. Ребятам из Google Cloud Doc было бы неплохо задокументировать это где-нибудь.

person Jose Bagatelli    schedule 26.10.2016