Я работаю над «пилотной» установкой веб-приложения, которое работает в 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 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
Вы можете рассмотреть возможность использования Прокси-сервер Cloud SQL, когда исходный IP-адрес экземпляра Compute Engine может измениться. Шаг 8 руководства объясняет, как запустить прокси, и вы можете использовать клиент mysql (шаг 9) для проверки соединения с экземпляром GCE.
После настройки прокси в URL подключения используйте localhost, поскольку это будет прокси, который будет устанавливать соединение на 127.0.0.1. Это в случае, если вы используете соединение сокета TCP, это другое, если вы используете сокеты Unix.