Подключение Java к Cloud SQL 2-го поколения с ВМ, управляемой Appengine

Попытка настроить подключение к Clond SQL 2-го поколения для Java Appengine с управляемой виртуальной машиной.

Что я имею:

  • ВМ использует режим совместимости с Appengine (FROM gcr.io/google_appengine/java-compat)
  • Я вижу канал MySQL на хосте (SSHed, я вижу сокет /cloudsql/**), но драйвер MySQL Java по умолчанию не поддерживает сокеты unix
  • Драйвер Google не поддерживается на управляемой виртуальной машине (java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver)
  • and I cannot connect to MySQL by IP
    • w/o driver it's No suitable driver found for jdbc:google:mysql://__IP__:3306/__db__
    • или тайм-аут для jdbc:mysql://__IP__:3306/__db__ (я добавил внешний IP-адрес MVM в авторизованные сети в MySQL)
    • но что интересно, я могу подключиться к этому порту с машины MVM, по крайней мере, порт открыт. В любом случае, мне не нравится идея подключения через публично открытый IP:PORT. У MVM каждый раз новый IP-адрес, поэтому я даже не могу добавить правило брандмауэра, чтобы указать доступ только из моего проекта.

Как настроить приложение ManagedVM для подключения к Cloud SQL?


person Igor Artamonov    schedule 15.01.2016    source источник
comment
Вероятно, вы не сможете внутренне подключиться, потому что Cloud SQL 2-го поколения в настоящее время не поддерживает App Engine. Если вы можете подключиться к клиенту mysql из управляемой виртуальной машины, вы сможете подключиться с внешним ip+user+password. Но может надо ставить не пропатченный гуглом драйвер? App Engine также не поддерживает подключение к внешнему SQL...   -  person dyeray    schedule 15.01.2016
comment
насколько я понимаю, CloudSQL Proxy (github.com/GoogleCloudPlatform/cloudsql-proxy), который включен на мой MVM, он поддерживает проксирование на localhost:3306. В настоящее время он создает только сокет unix, а не порт. Я предполагаю, что это конфигурация по умолчанию, и мне, вероятно, нужно добавить некоторую конфигурацию для открытия порта. все еще исследую, как я могу это сделать   -  person Igor Artamonov    schedule 15.01.2016
comment
Я не уверен, как работает CloudSQL Proxy, но, как я уже сказал, Cloud SQL 2-го поколения в настоящее время недоступен на Appengine, поэтому вам придется подключаться к общедоступному IP-адресу экземпляра Cloud SQL с помощью обычного драйвера MySQL.   -  person dyeray    schedule 15.01.2016
comment
Cloud SQL 2nd работает через канал Unix, см. cloud.google.com/sql/docs/sql. -прокси . Проблема с общедоступным IP-адресом заключается в том, что мне нужно установить закрытые ключи SSL в JVM. Я предполагаю, что это можно сделать с помощью пользовательского образа mvm, но это слишком много и вынуждает меня помещать секретные ключи в систему управления версиями исходного кода. Поэтому я думаю, что если у нас уже есть cloud-sql-proxy, поддерживаемый Google, уже развернутый в MVM, который отлично работает для Python MVM и совместим с Java, как я вижу в исходном коде, поэтому лучше использовать его и из Java, как стандартный инструмент. теперь вопрос в том, как запустить его с правильными аргументами   -  person Igor Artamonov    schedule 15.01.2016
comment
обнаружил, что сценарии mvm заблокировали все способы включения переадресации портов для sql-proxy, что может легко это исправить. может специально, может просто ошибка, может авторы просто борются с Java, но надеюсь скоро это исправят. кажется, что на данный момент единственный способ - это собственное изображение докера с ключами SSL, а mysql открыт для всего диапазона ips google :(   -  person Igor Artamonov    schedule 15.01.2016


Ответы (3)


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

props.put("junixsocket.file", "/cloudsql/project-id:region:instance-id");

Где project-id — название вашего проекта, region — регион, в котором находится ваш экземпляр Cloud SQL (например, us-east1), а instance-id — имя вашего экземпляра cloud-sql. Строка будет находиться в свойствах вашего экземпляра второго поколения в разделе «Имя соединения экземпляра».

person Kevin Malachowski    schedule 15.01.2016
comment
да, я думал об этом. но для этого требуется установить двоичный файл .so на виртуальную машину, а также я беспокоюсь о типе лицензии lib. Вместо этого я решил использовать SSL, но все же требуется собственная виртуальная машина. - person Igor Artamonov; 16.01.2016
comment
Лицензия выглядит как Apache 2, которая обычно считается относительно разрешительной. Я не юрист, но мое непрофессиональное понимание состоит в том, что вы можете использовать программное обеспечение в контексте сервера без каких-либо проблем. (Если это для коммерческого использования, вам следует сначала проконсультироваться с некоторыми настоящими юристами.) - person Kevin Malachowski; 17.01.2016
comment
О, я вижу. Извините моя ошибка. я нашел похожую библиотеку до вашего ответа (она выглядела похожей, поэтому я их просто перепутал). эта библиотека была под лицензией GPL/LGPL. Извините за недопонимание. - person Igor Artamonov; 17.01.2016

У нас есть новая библиотека Java для подключения к экземплярам Cloud SQL из управляемых виртуальных машин и других сред: https://github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory

Он все еще очень новый, поэтому применимы обычные предостережения, но мы не обнаружили никаких проблем в ходе нашего тестирования.

person Vadim    schedule 04.04.2016
comment
Только что попробовал, у меня работает безотказно. Может стоит упомянуть об этом в документах? В настоящее время они говорят, что облачный SQL не поддерживается для приложений Java cloud.google. .com/appengine/docs/flexible/java/using-cloud-sql - person Gabriel Ittner; 12.04.2016
comment
Спасибо. мы обязательно добавим его в документы! Мы собираем отзывы первых клиентов, прежде чем опубликовать их для более широкой аудитории. - person Vadim; 13.04.2016

Лучший способ, который я нашел, - настроить SSL-соединение с ManagedVM.

Есть две вещи, которые вы должны сделать.

Сначала подготовьте хранилище ключей Java с SSL, которое вы получите из консоли Cloud SQL (файлы server-ca.pem, client-cert.pem и client-key.pem):

echo '---------- GENERATE TrustStore'
keytool -import -alias mysqlCACert -file server-ca.pem -keystore truststore -storepass 123456

echo '---------- GENERATE KeyStore'
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem \
    -out client.p12 -name clientalias -CAfile server-ca.pem -caname root
keytool -importkeystore -deststorepass 123456 -destkeystore keystore \
    -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass 123456 -alias clientalias

Вы получите два файла: truststore и keystore, которые вам нужно будет поместить в целевую виртуальную машину.

Во-вторых, вы должны использовать пользовательский Dockerfile с файлами из предыдущего шага:

FROM gcr.io/google_appengine/java-compat

RUN mkdir /keys
ADD keystore /keys/
ADD truststore /keys/
ENV JAVA_OPTS -Djavax.net.ssl.keyStore=/keys/keystore -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.ssl.trustStore=/keys/truststore -Djavax.net.ssl.trustStorePassword=123456

ADD .  /app/

И, конечно же, не забудьте указать драйверу MySQL всегда использовать SSL:

dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://__CLOUD_SQL_IP__:3306/__CLOUD_SQL_DB__?useSSL=true&requireSSL=true");

PS Обратите внимание, я использую пароль 123456 для защиты своих ключей. Это просто пример. Не используйте его в своем проекте. Это уже занято.

person Igor Artamonov    schedule 16.01.2016
comment
К вашему сведению, у нас есть бета-версия небольшой библиотеки, упрощающей подключение из приложений Java. Я знаю, что у вас уже все работает, но если вам интересно, попробуйте: github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory - person Vadim; 29.03.2016