2

尝试为具有托管 VM 的 Java Appengine 设置与第二代克隆 SQL 的连接。

我得到了什么:

  • 虚拟机正在使用 Appengine 兼容模式 ( FROM gcr.io/google_appengine/java-compat)
  • 我在主机上看到一个 MySQL 管道(SSHed,我可以看到/cloudsql/**套接字),但默认的 MySQL Java 驱动程序不支持 unix 套接字
  • 托管 VM 上似乎不支持 Google 驱动程序 ( java.lang.ClassNotFoundException: com.mysql.jdbc.GoogleDriver)
  • 我无法通过 IP 连接到 MySQL
    • 无驱动程序,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?

4

3 回答 3

1

我在使用 Java 启动托管 VM 应用程序时遇到问题,所以我现在无法亲自尝试,但看起来您应该能够利用这个库从 Java 连接到 Unix 套接字。有一个示例,您只需要更改套接字的路径:

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

project-id您的项目名称在哪里,region是您的 Cloud SQL 实例所在的区域(例如us-east1),并且instance-id是您的 cloud-sql 实例的名称。该字符串将位于“实例连接名称”下的第二代实例的属性中。

于 2016-01-15T22:00:13.593 回答
1

我们有一个新的 Java 库,用于从托管 VM 和其他环境连接到 Cloud SQL 实例: https ://github.com/GoogleCloudPlatform/cloud-sql-mysql-socket-factory

它仍然很新,所以通常的警告适用,但我们在测试中没有发现任何问题。

于 2016-04-04T03:14:24.607 回答
0

我发现的最佳方法是从 ManagedVM 配置 SSL 连接

你应该做两件事。

首先,使用您将从 Cloud SQL 控制台获得的 SSL 准备 Java Keystore(文件和server-ca.pem):client-cert.pemclient-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

您将获得两个文件:truststorekeystore需要将它们放入目标 VM。

其次,您应该使用 custom 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 来保护我的密钥。这只是一个例子。不要在你的项目中使用它。它已经采取了。

于 2016-01-16T11:18:18.467 回答