我有一个简单的 Java servlet 应用程序,已部署到 GCP AppEngine。在同一个 GCP 下,我创建了一个 GCP Cloud SQL 的 MySQL 实例。
当有人发出 HTTP Post 请求时,我想将值保存在 MySQL 服务器上。但是,我的 Java 应用无法连接到 GCP Cloud SQL。
在 Cloud SQL 页面上,显示All apps in this project. All authorized.
但是,我的 Java 应用程序无法连接,即使它们位于同一个 GCP 项目下。
当我添加所有网络时,它可以正常工作。但是我不想这样做:
我无法从 App Engine 连接到 Cloud SQL 的原因可能是什么?我需要进行一些配置吗?
答案1
你不应该将 IP 地址列入白名单0.0.0.0/0
- 这允许任何 IP 地址尝试连接到你的实例,并且将被
我建议使用Cloud SQL JDBC 套接字工厂. Socket Factory 使用服务帐户凭证来验证与您的实例的连接。
您还可以查看这些关于从 App Engine 连接的说明页面以确保您已启用正确的 API 并授予服务帐户正确的权限。
答案2
您不应将所有 IP 列入白名单,这会使互联网上的任何人都可以访问您的 SQL 实例。
Google 通过 UNIX 套接字处理从 AppEngine 到 CloudSQL 的连接。为了从本地连接,您应该使用,而INSTANCE_CONNECTION_NAME
从 AppEngine 连接时,您应该将主机指定为,localhost
但将套接字路径添加为/cloudsql/<INSTANCE_CONNECTION_NAME>
。这适用于 NodeJS。
对于 JAVA 来说
// Configure which instance and what database user to connect with.
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER); // e.g. "root", "postgres"
config.setPassword(DB_PASS); // e.g. "my-password"
// For Java users, the Cloud SQL JDBC Socket Factory can provide authenticated connections.
// See https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory for details.
config.addDataSourceProperty("socketFactory", "com.google.cloud.sql.mysql.SocketFactory");
config.addDataSourceProperty("cloudSqlInstance", CLOUD_SQL_CONNECTION_NAME);
config.addDataSourceProperty("useSSL", "false");
其余配置保持不变。请查看相同的详细文档这里。
我已使用该配置成功运行了一段时间。