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