Mysql: Google Cloud SQL на App Engine — строка подключения устарела?

Созданный на 25 сент. 2016  ·  35Комментарии  ·  Источник: go-sql-driver/mysql

Описание проблемы

В файле 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)

documentation

Самый полезный комментарий

@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 теперь все равно поддерживается.

Все 35 Комментарий

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 часов гугления! Аллилуйя!!!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги