2016-09-23 4 views
2

Я использую экземпляр Google Cloud SQL (второе поколение), и я могу успешно подключиться к нему локально после авторизации моего собственного IP-адреса. У меня есть код Go, который успешно извлекает строки из таблиц, и у меня есть код, который успешно добавляет строки в таблицы. Однако при развертывании приложения приложение не может подключиться к серверу. Каждый раз, когда вызывается функция SQL, сервер возвращает ответ 500. Мое приложение разрешено подключаться к этому SQL, например:Не удается подключиться к Google Cloud SQL-серверу из развернутого приложения

enter image description here

Я использую следующий Go код подключения:

func dialSQL() (*sql.DB, error) { 
    if appengine.IsDevAppServer() { 
     return sql.Open("mysql", "root:[email protected](xxx.xxx.xxx.xxx:3306)/Dbname") 
    } else { 
     return sql.Open("mysql", "[email protected](projectid:regionname:instancename)/Dbname") 
    } 
} 

В развернутой версии и локальную версию используете один и тот же кодовую, но развернутая версия использует вторую строку соединения в функции dialSQL().

Я использую этот драйвер Go MySQL: https://github.com/go-sql-driver/mysql

документация для этого драйвера упоминает следующую строку соединения для подключения к серверу Google Cloud SQL с помощью Google App Engine: [email protected](project-id:instance-name)/dbname

Я использую ProjectID: regionname: имя_экземпляр, а не ProjectID: имя_экземпляр, потому что этот пост упоминается необходимость включения regionname: google app engine golang, driver: bad connection

Смутно, документация Google также опускает regionname: https://cloud.google.com/appengine/docs/go/cloud-sql/reference

Я пробовал оба варианта соединительной строки.

В соответствии с this post развернутое приложение попытается подключиться к серверу с помощью host = localhost, а в соответствии с this post пароль для «root» @ localhost должен быть пустым.

Я сделал следующий запрос в моей консоли mysql, чтобы убедиться, что у пользователя 'root' @ 'localhost' действительно есть пустой пароль: select User, Host, HEX(authentication_string) from mysql.user. У пользователя «root» @ '%' все еще есть пароль, указанный в консоли экземпляра Google Cloud SQL.

Я просмотрел possible issue относительно области приложения GAE и сервера Cloud SQL, но они находятся в том же регионе. Я также узнал, что для серверов Google Cloud SQL второго поколения областям приложения и сервера разрешено различать.

Я также создал нового пользователя и попытался подключиться к экземпляру с именем пользователя нового пользователя в строке подключения. Это не исправило ошибку.

Я также попытался добавить правило брандмауэра, но это не решить проблему либо:

enter image description here

Наконец, я пошел в секцию Compute Engine в Google Cloud Console и SSHed в VM который служит последнему экземпляру моего приложения. Я успешно проверил IP-адрес облачного SQL-сервера, но telnet xxx.xxx.xxx.xxx 3306 приурочен. Я также побежал lsof -i TCP:3306 и lsof -i | grep 3306, но процессов не было. Я также установил mysql в это поле и попытался подключиться к серверу оттуда, но соединение не удалось.

Кто-нибудь знает, что может вызвать эту проблему?

ответ

2

Похоже, что может быть an issue с the Go MySQL driver когда развернутый Google App Engine приложение пытается подключиться к второго поколения Google Cloud SQL Server.

Я создал первого поколения экземпляра Cloud SQL, и я смог успешно подключиться к серверу с помощью развернутого Google приложения App Engine с этой строки подключения:

[email protected](project-id:instance-name)/dbname

Нет имени региона потребовалось.

+0

У меня такая же проблема, и переход на БД первого поколения решает проблему. У вас был какой-то прогресс в выяснении причины проблемы с БД второго поколения? –

+1

Мы не смогли подключиться ко второму поколению Google Cloud SQL Server из нашего развернутого приложения GAE, работающего в стандартной среде, поэтому мы продолжали использовать сервер первого поколения. Я провел некоторое тестирование и создал простое приложение GAE, которое работает в гибкой среде appengine, и я смог подключиться к SQL Server второго поколения. Проблема должна быть связана с средой движка приложения. – rudolph1024

0

Ребят Предложенное решение Google для подключения 2-го поколения здесь: сообщается документация "TLS requested but server does not support TLS" error with Google Cloud SQL (2nd generation) from Google App Engine?

Google была (и, возможно, до сих пор) неправильно, но правильное решение размещено там. Мы используем Cloud SQL второго поколения в производстве без проблем.

+1

Я не думаю, что он упоминает TLS или SSL здесь. – Theyouthis