我正试图从本地机器连接到我的GCP项目PostgreSQL CloudSQL实例。PostgreSQL没有公共IP,只有私有IP。
Properties connProps = new Properties();
connProps.setProperty("user", "XXX-compute@developer.gserviceaccount.com");
connProps.setProperty("password", "password");
connProps.setProperty("sslmode", "disable");
connProps.setProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory");
connProps.setProperty("cloudSqlInstance", "coral-XXX-XXXX:us-central1:mdm");
connProps.setProperty("enableIamAuth", "true");
HikariConfig config = new HikariConfig();
config.setJdbcUrl(jdbcURL);
config.setDataSourceProperties(connProps);
config.setConnectionTimeout(10000); // 10s
HikariDataSource connectionPool = new HikariDataSource(config);
我得到以下错误
无法获取jdbcUrl=jdbc:p的驱动程序实例ostgresql:///mdm
java.sql.SQLException:没有合适的驱动程序
我已经验证了我的用户名、实例名和IAM连接是否正常。我正在使用的IAM服务帐户是我的计算引擎的默认服务帐户。
我应该能够从本地机器连接到这个PostgreSQL实例吗?
首先,确保正确配置JDBC URL。
URL应该如下所示:
jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<POSTGRESQL_USER_NAME>&password=<POSTGRESQL_USER_PASSWORD>
有关详细信息,请参阅文档。
第二,如果您的云SQL实例仅为私有IP,则除非您明确配置了网络路径,否则您的本地计算机将没有网络路径(有关选项,请参阅此答案(。
通常,连接到私有IP实例的最简单方法是在与该实例相同的VPC中运行VM,并从该VM进行连接。
虽然从安全角度来看,只启用私有IP并从云SQL实例中删除公共IP是一种很好的做法,但在考虑连接时需要注意一些事项。
由于云SQL实例只启用了私有IP,因此无论是使用私有IP还是使用云SQL代理,都无法直接从本地计算机连接到它。
现在,在您的案例中,正如您所提到的,您在Cloud SQL实例中只启用了私有IP,这似乎是您出现错误的原因。
为了减轻错误-
如果可能的话,我建议您提供一个公共IP地址用于Cloud SQL实例,然后尝试通过正确连接指定这里提到的jdbc URL,它看起来像这样-
jdbc:postgresql:///<DATABASE_NAME>?cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<POSTGRESQL_USER_NAME>&password=<POSTGRESQL_USER_PASSWORD>
否则,如果您不想提供公共IP地址,请从可以使用的外部资源建立连接云VPN隧道或VLAN附件(如果您有专用Interconnect或此处提到的合作伙伴Interconnect。
如果您没有专用互连或合作伙伴互连,并且只想使用专用IP,那么要连接到云SQL,您可以通过计算引擎VM实例启用端口转发。这分两步完成-
- 通过私有IP将计算引擎连接到云SQL实例
- 将本地机器数据库连接请求转发给计算引擎,通过云SQL代理隧道到达云SQL实例。这个youtube视频描述了如何做到这一点
要获得上述内容的详细描述,您可以阅读本文。