2

Попытка установить соединение с Clond SQL 2nd Generation для Java Appengine с управляемой виртуальной машиной.Java connect to Cloud SQL 2nd Gen из Appengine Управляемая VM

Что я получил:

  • VM использует режим Appengine Compat (FROM gcr.io/google_appengine/java-compat)
  • Я вижу трубу MySQL на хосте (SSHed, я могу видеть /cloudsql/** сокет), но по умолчанию MySQL Java оленья кожа драйвер поддержка Unix сокетов
  • Google Driver, кажется, не поддерживается на управляемых VM (java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver)
  • , и я не могу подключиться к MySQL с помощью IP
    • без водителя это No suitable driver found для jdbc:google:mysql://__IP__:3306/__db__
    • или тайм-аут для jdbc:mysql://__IP__:3306/__db__ (я добавил MVM внешний IP для авторизованных сетей на MySQL)
    • но что интересно, я могу подключиться к этому порту из MVM машины, в открыт наименьший порт. Во всяком случае, мне не нравится идея подключения через открытый IP: PORT. MVM имеют новый IP каждый раз, так что я даже не могу добавить правило брандмауэра, чтобы указать доступ из моего проекта только

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

+0

Возможно, вы не сможете подключиться внутренне, потому что Cloud SQL 2nd gen в настоящее время не поддерживает App Engine. Если вы можете подключиться к клиенту mysql из управляемой виртуальной машины, вы должны иметь возможность подключаться к внешнему ip + пользователю + паролю. Но, возможно, вам нужно установить драйвер, не исправленный Google? App Engine не поддерживает подключение к внешнему SQL ... – dyeray

+0

, как я понимаю, CloudSQL Proxy (https://github.com/GoogleCloudPlatform/cloudsql-proxy), который включен на моем MVM, он поддерживает проксирование на 'localhost: 3306 '. В настоящее время он создает только unix-сокет, а не порт. Я предполагаю, что это конфигурация по умолчанию, и мне, вероятно, нужно добавить некоторую конфигурацию для открытия порта. все еще исследуя, как я могу это сделать –

+0

Я не уверен, как работает CloudSQL Proxy, но, как я уже сказал, Cloud Gen 2nd gen в настоящее время недоступен в Appengine, поэтому вам нужно будет подключиться к общедоступному IP экземпляра Cloud SQL с обычным MySQL. – dyeray

ответ

1

У меня возникли проблемы с запуском управляемого приложения VM с использованием Java, поэтому я не могу попробовать это для себя прямо сейчас, но похоже, что вы должны иметь возможность использовать this library для подключения к Unix Socket с Java. Там в example, в котором вы просто должны изменить путь сокета:

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

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

+0

Да, я подумал об этом, но он требует установки двоичного '.so' в VM, а также я волнуюсь о лицензировании лицензии на lib.Я решил использовать SSL вместо этого, по-прежнему требуется специальная VM, хотя –

+0

. Лицензия, похоже, является Apache 2, которая обычно считается относительно разрешительной. Я не юрист, но понимание моего непрофессионала заключается в том, что вы можете использовать программное обеспечение в контексте сервера без каких-либо проблем. (Если это для коммерческого использования, сначала вы должны проверить у некоторых настоящих юристов.) –

+0

О, я вижу. Извините, моя ошибка. Я нашел подобный lib до вашего ответа (он выглядел похожим, поэтому Я просто смутил их), что lib был лицензирован GPL/LGPL. Извините за путаницу. –

0

Лучший способ я нашел, чтобы настроить 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 для защиты моих ключей. Это просто пример. Не используйте его в своем проекте. Это уже сделано.

+0

FYI у нас есть бета-версия небольшой библиотеки, чтобы упростить подключение к Java-приложениям. Я знаю, что у вас уже есть вещи король, но если вам интересно, сделайте снимок: https://github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory – Vadim

1

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

Это все еще очень новый, так что обычные предостережения применяются, но мы не нашли каких-либо проблем в нашем тестировании ,

+0

Просто попробовал, и он работает безупречно для меня. Может быть, вы должны упомянуть об этом в документах? В настоящее время говорят, что облако sql не поддерживается для java-приложений https://cloud.google.com/appengine/docs/flexible/java/using-cloud-sql –

+0

Спасибо. мы обязательно добавим его в документы! Мы собираем отзывы от ранних клиентов, прежде чем публиковать их более широкой аудитории. – Vadim

+0

Есть ли решение [для этого] (http: // stackoverflow.ком/вопросы/37644148/Java-Ланг-IllegalStateException-может-не-нагрузка JDBC-драйвер класс COM-MySQL-JDB)? : / – displayname