Я использую экземпляр Google Cloud SQL (второе поколение), и я могу успешно подключиться к нему локально после авторизации моего собственного IP-адреса. У меня есть код Go, который успешно извлекает строки из таблиц, и у меня есть код, который успешно добавляет строки в таблицы. Однако при развертывании приложения приложение не может подключиться к серверу. Каждый раз, когда вызывается функция SQL, сервер возвращает ответ 500. Мое приложение разрешено подключаться к этому SQL, например:Не удается подключиться к Google Cloud SQL-серверу из развернутого приложения
Я использую следующий 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 второго поколения областям приложения и сервера разрешено различать.
Я также создал нового пользователя и попытался подключиться к экземпляру с именем пользователя нового пользователя в строке подключения. Это не исправило ошибку.
Я также попытался добавить правило брандмауэра, но это не решить проблему либо:
Наконец, я пошел в секцию Compute Engine в Google Cloud Console и SSHed в VM который служит последнему экземпляру моего приложения. Я успешно проверил IP-адрес облачного SQL-сервера, но telnet xxx.xxx.xxx.xxx 3306
приурочен. Я также побежал lsof -i TCP:3306
и lsof -i | grep 3306
, но процессов не было. Я также установил mysql в это поле и попытался подключиться к серверу оттуда, но соединение не удалось.
Кто-нибудь знает, что может вызвать эту проблему?
У меня такая же проблема, и переход на БД первого поколения решает проблему. У вас был какой-то прогресс в выяснении причины проблемы с БД второго поколения? –
Мы не смогли подключиться ко второму поколению Google Cloud SQL Server из нашего развернутого приложения GAE, работающего в стандартной среде, поэтому мы продолжали использовать сервер первого поколения. Я провел некоторое тестирование и создал простое приложение GAE, которое работает в гибкой среде appengine, и я смог подключиться к SQL Server второго поколения. Проблема должна быть связана с средой движка приложения. – rudolph1024