Search code examples
google-cloud-platformgoogle-cloud-sql

Cannot connect to Cloud SQL with Java SocketFactory Library


This is a duplicate question I made on Cloud SQL google group discuss forum: https://groups.google.com/forum/#!topic/google-cloud-sql-discuss/qYmjvfH0MdI

I'm using Cloud Dataflow to run some pipelines using Cloud SQL as a sink in my personal account. After the pipeline is executed, I want to make a connection to Cloud SQL to run a delete statement. I can't run deletes with JdbcIO (only selects and inserts). Even though I can connect to Cloud SQL with JdbcIO, I cannot connect to it using plain Jdbc.

Below is the code I'm using to connect to my instance

static void cleanUpPipeline() {
    String jdbcUrl = String.format(
            "jdbc:postgresql://google/%s?cloudSqlInstance=%s"
                + "&socketFactory=com.google.cloud.sql.postgres.SocketFactory",
            "xxxxxx",
            "xxxxxx");

    try {
        Class.forName("org.postgresql.Driver");
        Connection connection = DriverManager.getConnection(jdbcUrl, "xxxxxx", "xxxxxx");
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

My pom.xml has the following dependencies:

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>postgres-socket-factory</artifactId>
    <version>1.0.11</version>
</dependency>

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.5</version>
</dependency>

The error I receive is:

INFO: Connecting to Cloud SQL instance [xxxxxxxxx] via ssl socket. nov 13, 2018 2:53:49 PM com.google.cloud.sql.core.SslSocketFactory getInstance

INFO: First Cloud SQL connection, generating RSA key pair. nov 13, 2018 2:53:51 PM com.google.cloud.sql.core.SslSocketFactory fetchInstanceSslInfo

INFO: Obtaining ephemeral certificate for Cloud SQL instance [xxxxxx]. nov 13, 2018 2:53:54 PM com.google.cloud.sql.core.SslSocketFactory createAndConfigureSocket

INFO: Connecting to Cloud SQL instance [xxxxxxxx] on IP [xxxxxxx] org.postgresql.util.PSQLException: Connection to google:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

I believe I'm doing everything right here. Can anyone help me?


Solution

  • At the end, it was a firewall issue. I couldn't access port 3307 from inside the firewall, which is the port Cloud SQL Proxy uses. I believe the Java SocketFactory library also needs to use that port.