В файле readme для этого драйвера строка подключения для подключения к Google Cloud SQL в App Engine указана следующим образом:
user@cloudsql(project-id:instance-name)/dbname
Хотя документация пакета Google cloudsql также подтверждает это для вашего драйвера, в Stack Overflow есть сообщения, такие как этот , в которых утверждается, что нужно использовать projectid:regionname:instancename
, а не projectid:instancename
.
Какова правильная строка подключения? Ни один из них в настоящее время не работает.
Более подробный пост можно найти здесь: http://stackoverflow.com/questions/39668672/trouble-connecting-to-google-cloud-sql-server-from-deployed-app
Мой сервер возвращает ответ 500 всякий раз, когда я звоню в конечную точку, использующую базу данных Cloud SQL. Соединение с базой данных работает нормально, когда я подключаюсь к серверу из локально обслуживаемой версии моего приложения.
Я пробовал различные строки подключения, и вот некоторые ошибки, которые были зарегистрированы в Google Cloud Console:
5447 [Warning] 'user' entry 'root<strong i="21">@localhost</strong>' ignored in --skip-name-resolve mode.
5447 [Warning] entry 'root'@'localhost' in mysql.user is ignored because it duplicates entry in mysql.system_user
14409 [Note] Aborted connection 14409 to db: 'User' user: 'root' host: 'xxx.xxx.xxx.xxx' (Got an error reading communication packets)
(В строке подключения не был указан пароль, поскольку в документации не указывается необходимость пароля. В этом сообщении упоминается, что пароль подключения должен быть нулевым, когда приложение пытается подключиться к серверу с помощью root@localhost
.)
6170 [Note] Access denied for user 'root'@'cloudsqlproxy~xx.xxx.xxx.xx' (using password: NO)
Я также попытался подключиться к пользователю, отличному от пользователя root (имя пользователя: newuser):
5447 [Warning] 'user' entry 'newuser<strong i="30">@localhost</strong>' ignored in --skip-name-resolve mode.
_ Версия драйвера (или git SHA): _ https://github.com/go-sql-driver/mysql/tree/3654d25ec346ee8ce71a68431025458d52a38ac0
_Go версия:_ версия go go1.6.2 linux/amd64
_Версия сервера:_ Экземпляр Google Cloud SQL работает под управлением MySQL 5.7.
_Серверная ОС:_ На вкладке Compute Engine видно, что сервер, на котором размещена самая последняя версия моего приложения, работает под управлением Debian 7.11 (Wheezy)
user@cloudsql (идентификатор проекта: имя экземпляра)/имя базы данных
Это старый. Он до сих пор работает, потому что я до сих пор им пользуюсь.
Недавно gae также начала категоризировать базу данных по регионам, отсюда и новый формат. Если ваш cloudsql относится к региону, вам нужно будет использовать новый формат
Возможно, этот драйвер неправильно анализирует новый формат. Это может быть проблемой
В вашем случае вы используете сервер Cloud SQL второго поколения?
Нет первого поколения
Я подозреваю, что драйвер не анализирует новый формат. Код, возможно, потребуется изменить, чтобы он принимал содержимое до первого двоеточия и содержимое после первого двоеточия независимо от присутствия нового двоеточия.
В настоящее время обновляется запрос на вытягивание, прочитайте меня
Спасибо за внимание. Я только что оставил комментарий к этому пиару.
В качестве временного обходного пути я настрою сервер первого поколения, пока проблема с драйвером не будет устранена.
Обновление: похоже, возникла проблема с драйвером, когда развернутое приложение Google App Engine пытается подключиться к Google Cloud SQL Server второго поколения.
Я создал Cloud SQL Server первого поколения и смог успешно подключиться к серверу с помощью развернутого приложения Google App Engine со следующей строкой подключения:
user@cloudsql(project-id:instance-name)/dbname
Название региона не требовалось.
Разбор не должен быть проблемой, драйвер берет все между скобками: https://github.com/go-sql-driver/mysql/blob/master/dsn.go#L282 .
Он используется только в https://github.com/go-sql-driver/mysql/blob/master/driver.go#L65 .
Может ли кто-нибудь с учетной записью cloudsql загрузить драйвер, отредактировать https://github.com/go-sql-driver/mysql/blob/master/appengine.go#L14 и заменить "appengine/cloudsql"
на "google.golang.org/appengine/cloudsql"
, попробуйте со старой и новой версией с регионом и без него и сообщите, что работает? Спасибо!
_Ребята, для справки: _
Предоставленное Google решение для подключения ко второму поколению находится здесь:
http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error-with-google-cloud-sql-2nd
Документация, размещенная Google, была (и, возможно, до сих пор) неправильной , но там размещено правильное решение. Мы без проблем используем Cloud SQL 2-го поколения в производственной среде.
Есть ли этому решение? Определенно не работает с CloudSQL второго поколения.
@bagatelli смотри мой комментарий выше твоего
@benguild Я видел ваш комментарий в нескольких местах. Однако вы предполагаете, что все используют SSL в своих соединениях, что не относится ко всем. Конечно это не мое. Я получаю сообщение об ошибке «Драйвер: плохое соединение». Доступ к базе данных невозможен, поскольку драйвер не может правильно определить параметры соединения. Я думаю, что проблема кроется где-то в беспорядке, который был вокруг пакетов «новый appengine» и «старый appengine», из-за чего многие вещи ломаются, и Google не удосуживается должным образом документировать это изменение.
@bagatelli Чтобы уточнить, убедитесь, что вы используете формат строки подключения, упомянутый в этом комментарии: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- с-google-cloud-sql-2nd#comment65140499_38890022
Извините за предыдущую краткость. Мы без проблем используем второе поколение Go on App Engine. Просто оставьте параметр «tlsConfigName», так как прокси-сервер SQL добавит его, но в любом случае они сообщают, что TLS теперь все равно поддерживается.
@бенгильд . Спасибо за все ваши усилия, помогая мне во всех этих вопросах.
Вы используете «новый appengine» или «старый appengine»? Я только что провел день, преобразовывая весь свой код в этот новый кошмар, который представляет собой новые пакеты appengine, и, как вы, возможно, знаете из моего другого поста, я больше не могу развертывать свой код, и поэтому я не могу должным образом протестировать то, что вы предложили выше . Я попробую еще раз, как только найду решение для развертывания своего приложения.
Спасибо!
@bagatelli Если у вас возникли проблемы с развертыванием, попробуйте загрузить свой код на виртуальную машину или использовать Google Cloud Console.
@bagatelli Я имел в виду ... попробовать это на новой машине или использовать их облачную консоль (в которой уже есть инструменты разработки), прежде чем вы спишете тот факт, что это определенно не связано с окружающей средой.
В настоящее время я не могу выполнить развертывание с помощью macOS Sierra из-за ошибки четырехмесячной давности, но мы можем выполнить развертывание с виртуальной машины.
Я уверен, что для вас будет больше работы, если вы полностью отойдете от окружающей среды, поэтому я, по крайней мере, обязательно исключаю это, прежде чем полностью уйти.
@pjebs . Не знаю, откуда у вас такое предположение, но я не использую гибкую среду.
@pjebs Это неправильно. В настоящее время вы выполняете стандартное развертывание.
@pjebs appcfg.py update
также работает.
@bagatelli Я слышу вас - обычно я склонен сводить к минимуму свои сторонние зависимости, а также зависимости от API, поскольку то, что вы говорите, правда ... Google не обязан предоставлять поддержку, хотя в противном случае они рискуют своей репутацией.
Я не уверен, в чем именно сейчас заключается ваша проблема (помимо использования старых API, я думаю?), но каждый элемент программного обеспечения, который я разработал для App Engine, я также разрабатывал с намерением отказаться от App Engine, если и когда нужно. Например, для каждого API Google, с которым я взаимодействую, я пишу «помощник», который на самом деле вызывает методы и предоставляет свои собственные для остальной части приложения, так что и только это нужно приспосабливать к новой среде, когда это необходимо и [ надеюсь], не нарушая остальную часть приложения.
Для меня App Engine больше удобен, так как это среда, которая требует небольшой настройки, помимо масштабирования и настроек, и предоставляет несколько отличных API. Это раздражает, когда что-то идет не так, но они предлагают премиальную поддержку, если у вас есть проблемы, подобные тому, о чем вы говорите?
@pjebs. Насколько я понимаю, goapp — это просто оболочка для appcfg.py. В какой-то момент он вызовет appcfg.py.
@bagatelli Конечно, пришлите мне письмо. Без проблем
@бенгильд . Наконец-то мне удалось развернуть свое приложение, но мне все еще не удалось подключиться к CloudSQL.
Я обновил все свое приложение, чтобы использовать пакеты «нового appengine», а также установил импорт clousql на google.golang.org/appengine/clousql в «appengine.go» в пакете драйвера mysql.
Затем я создал клиентский сертификат из панели управления CloudSQL и соответствующим образом обновил свой код, используя RegisterTLSConfig, как описано в документации драйверов, предоставив конфигурацию tls в качестве параметра, как указано в ваших сообщениях в stackoverflow. Мое URL-соединение выглядит так:
root:password@cloudsql (имя-экземпляра-соединения-скопировано-из-облачной-консоли)/myDatabase?tls=customTls
Все равно не повезло. Ошибка:
Драйвер: Плохое соединение
@арнехорманн . Это ответ на ваш вопрос из вашего поста выше.
@bagatelli Попробуйте без TLS.
@бенгильд . Пробовал без tls. Неудачно.
Драйвер: Плохое соединение
@pjebs . Не уверен, что вы полностью понимаете проблему здесь. Драйвер даже не доходит до базы данных. Я понимаю, что то, что вы упомянули выше, может быть правдой в производственной среде, но я даже не могу установить одно соединение с базой данных, поэтому в моем случае вышеизложенное вообще не применяется.
@bagatelli Что бы я сделал, так это опубликовать на Stack Overflow, как я это сделал, и пометить его: google-cloud-sql
... Надеюсь, кто-то из Google должен ответить.
Если у вас возникла эта проблема, они хотели бы, чтобы она была проиндексирована для других, у которых такая же проблема. Ответьте здесь со ссылкой на вопрос после его решения.
Скорее всего, это все еще связано с вашей реализацией, потому что, как я уже сказал, люди используют 2-е поколение в производстве, и оно находится вне бета-версии.
@bagatelli Вы не забыли отключить параметр «Требуется TLS» для экземпляра в облачной консоли?
Спасибо @benguild и @pjebs . Опубликую на SO и сообщу здесь, если найду причину.
@бенгильд . Я не вижу упоминания о TLS в облачной консоли.
Я думаю, вы имеете в виду «Разрешить только SSL-соединение». Если это то, о чем вы говорите, то да, это не так.
Хорошо, ребята, я нашел проблему. И дело было не в драйвере, не в моем приложении и не в CloudSQL. Проект, в котором я развертываю приложение, был создан много лет назад через старую консоль разработчиков.
На вкладке «Контроль доступа» в облачной консоли есть метка «Приложения в этом проекте: все авторизованы». и когда проект создается, он также создает учетные записи AppEngine и Compute Engine по умолчанию. Проблема в том, что в этом конкретном проекте не было обеих учетных записей по умолчанию, и я уверен, что проблема в этом. Что, вероятно, произошло, так это то, что Google не создал эти учетные записи, когда они перенесли appengine на облачную консоль, которая использует IAM и администратора для управления учетными записями доступа.
Я предполагаю это, потому что, когда я заметил, что учетные записи по умолчанию отсутствуют, я создал новый проект и новую базу данных облачных sql и развернул точно такой же код в этом новом проекте, и _voila_... Все работает просто отлично.
@benguild @pjebs Очень ценю все ваши усилия, помогающие мне решить эту проблему.
@benguild Я удалил все несвязанные комментарии из нашего предыдущего разговора, так как я думаю, что мы находимся на одной странице, связанной с AppEngine/Google. Отправим вам электронное письмо об этом позже.
Я разместил этот вопрос на StackOverflow и отвечу на него этим открытием, чтобы другие люди с такой же проблемой могли извлечь из этого пользу.
http://stackoverflow.com/questions/40020782/connect-to-google-sql-cloud-2nd-generation-with-go-on-appengine
Спасибо еще раз!
Да, если у App Engine нет доступа к экземпляру SQL, у вас возникнут проблемы. 👍🏻
Исправлено #485
Все, что я могу сказать, это спасибо @benguild ! Вы помогли мне перестать биться головой о клавиатуру после 500 открытых вкладок Chrome и 5 часов гугления! Аллилуйя!!!
Самый полезный комментарий
@bagatelli Чтобы уточнить, убедитесь, что вы используете формат строки подключения, упомянутый в этом комментарии: http://stackoverflow.com/questions/38890022/tls-requested-but-server-does-not-support-tls-error- с-google-cloud-sql-2nd#comment65140499_38890022
Извините за предыдущую краткость. Мы без проблем используем второе поколение Go on App Engine. Просто оставьте параметр «tlsConfigName», так как прокси-сервер SQL добавит его, но в любом случае они сообщают, что TLS теперь все равно поддерживается.