Java подключается к Cloud SQL 2nd Gen из управляемой виртуальной машины Appengine

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

Что я имею:

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

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

3 ответа

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

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

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

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

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

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

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

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

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