Подключение к MySQL второго поколения из веб-приложения Tomcat на экземпляре GCE

Я работаю над «пилотной» установкой веб-приложения, которое работает в Tomcat, в экземпляре GCE, который обращается к серверу MySQL второго поколения. По мере того, как я приближаюсь к тому, чтобы сделать его работоспособным, я сталкиваюсь с чем-то, что не могу понять.

Дано:

Приложение находится в Java, контексте веб-приложения, работающем на сервере Tomcat, на том, что должно быть кластером экземпляров GCE с балансировкой нагрузки.

И все эти экземпляры совместно используют несколько общих сегментов хранилища и общий экземпляр MySQL второго поколения для своей базы данных.

Теперь разработчик, отвечающий за веб-приложение, запустил экспериментальный кластер в своем собственном частном проекте Google Cloud, в котором он просто открыл миру SQL-сервер и не стал беспокоиться о каком-либо SSL. Но очевидно, что это не сработает, когда мы будем приближаться к реальности.

Я пытаюсь приблизиться к настоящему. Но как мне настроить подключения к базе данных, если я не знаю, какие IP-адреса будут иметь экземпляры GCE?

Посмотрев на вкладку «Авторизация» для моего экземпляра MySQL, я вижу:

App Engine authorization
All apps in this project are authorized by default. To authorize apps in other projects,
follow the steps below.
Apps in this project: All authorized.

Но это «App Engine». Нет Google Compute Engine.

И я вижу что-то под названием «JDBC Socket Factory», но это на странице о подключении из приложений, работающих под управлением за пределами из Google Cloud.

И я вижу страницу о подключении клиента MySQL к экземпляру Google Compute (который вызывает вопрос: «Зачем мне делать что, если я могу подключиться со своего рабочего стола через что-то более удобное для пользователя?»). Нет подключает контекст веб-приложения Tomcat, работающий на динамически созданном экземпляре.

Что мне здесь не хватает?


Сейчас я экспериментировал с прокси-сервером и обнаружил, что могу подключиться, если прокси-сервер работает под моей учетной записью, но не, если он работает под одной из двух учетных записей служб, которые также должны иметь возможность подключаться.

Во всех трех случаях прокси запускается и ожидает подключения. Если я запускаю прокси от имени себя, я могу нормально подключиться, будь то из клиента MySQL по умолчанию, из Sequel Pro или из Squirrel. Но если я запускаю прокси из учетной записи службы по умолчанию или из учетной записи службы, которую я создал специально для этого, клиент получает:

MySQL said: Lost connection to MySQL server at 'reading initial communication packet', system error: 0

и прокси показывает:

2018/03/22 09:38:23 New connection for "<REDACTED>"
2018/03/22 09:38:24 couldn't connect to "<REDACTED>": ensure that the
account has access to "<REDACTED>" (and make sure there's no typo in 
that name). Error during createEphemeral for <REDACTED>: googleapi: 
Error 403: Access Not Configured. Cloud SQL Administration API has
not been used in project 773874261491 before or it is disabled.
Enable it by visiting
https://console.developers.google.com/apis/api/sqladmin.googleapis.com
/o erview?project=<REDACTED> then retry. If you enabled this API
recently, wait a few minutes for the action to propagate to our
systems and retry., accessNotConfigured

У меня есть:

  • Администратор Cloud SQL
  • Клиент Cloud SQL
  • Администратор вычислительного экземпляра (версия 1)
  • Администратор вычислительной сети
  • Администратор безопасности вычислений
  • Редактор диспетчера развертывания
  • Актер сервисного аккаунта
  • Администратор учетной записи службы
  • Администратор ключа служебного аккаунта
  • Администратор проекта IAM
  • Администратор хранилища

Учетная запись службы по умолчанию имеет:

  • Редактор клиента Cloud SQL

В созданной мной учетной записи службы есть:

  • Клиент Cloud SQL

На предложение попробовать повторно включить Cloud SQL API я отключил его и снова включил. Без изменений. По-прежнему:

Jamess-Mac-mini:~ jamesl$ ./cloud_sql_proxy -instances=<REDACTED>=tcp:3306
2018/03/22 09:37:42 Listening on 127.0.0.1:3306 for <REDACTED>
2018/03/22 09:37:42 Ready for new connections
{Sequel Pro connected just fine}
2018/03/22 09:37:50 New connection for "<REDACTED>"
2018/03/22 09:37:52 New connection for "<REDACTED>"
2018/03/22 09:38:01 Client closed local connection on 127.0.0.1:3306
2018/03/22 09:38:01 Client closed local connection on 127.0.0.1:3306
^C
Jamess-Mac-mini:~ jamesl$ ./cloud_sql_proxy -instances=<REDACTED>=tcp:3306 -credential_file=<REDACTED my new service account>.json
2018/03/22 09:38:19 using credential file for authentication; email=<REDACTED my new service account>
2018/03/22 09:38:19 Listening on 127.0.0.1:3306 for <REDACTED>
2018/03/22 09:38:19 Ready for new connections
{Sequel Pro failed to connect}
2018/03/22 09:38:23 New connection for "<REDACTED>"
2018/03/22 09:38:24 couldn't connect to "<REDACTED>": ensure that the
account has access to "<REDACTED>" (and make sure there's no typo in
that name). Error during createEphemeral for <REDACTED>: googleapi: 
Error 403: Access Not Configured. Cloud SQL Administration API has
not been used in project 773874261491 before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=<REDACTED>
then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured
^C
Jamess-Mac-mini:~ jamesl$ ./cloud_sql_proxy -instances=<REDACTED>=tcp:3306 -credential_file=<REDACTED default service account>.json
2018/03/22 09:46:41 using credential file for authentication; email=<REDACTED default service account>
2018/03/22 09:46:41 Listening on 127.0.0.1:3306 for <REDACTED>
2018/03/22 09:46:41 Ready for new connections
{Sequel Pro failed to connect}
2018/03/22 09:46:45 New connection for "<REDACTED>"
2018/03/22 09:46:46 couldn't connect to "<REDACTED>": ensure that the account has access to "<REDACTED>" (and make sure there's no typo in that name). Error during createEphemeral for <REDACTED>: googleapi: Error 403: Access Not Configured. Cloud SQL Administration API has not been used in project <REDACTED> before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=<REDACTED> then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry., accessNotConfigured
^C
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
118
1

Ответы 1

Вы можете рассмотреть возможность использования Прокси-сервер Cloud SQL, когда исходный IP-адрес экземпляра Compute Engine может измениться. Шаг 8 руководства объясняет, как запустить прокси, и вы можете использовать клиент mysql (шаг 9) для проверки соединения с экземпляром GCE.

После настройки прокси в URL подключения используйте localhost, поскольку это будет прокси, который будет устанавливать соединение на 127.0.0.1. Это в случае, если вы используете соединение сокета TCP, это другое, если вы используете сокеты Unix.

Другие вопросы по теме