无法从 GCP AppEngine 连接到 GCP Cloud SQL

无法从 GCP AppEngine 连接到 GCP Cloud SQL

我有一个简单的 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 项目下。

当我添加所有网络时,它可以正常工作。但是我不想这样做:

来自 gcp 控制台的 ss

我无法从 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");

其余配置保持不变。请查看相同的详细文档这里

我已使用该配置成功运行了一段时间。

相关内容