我无法通过 sql 身份验证代理在 GCP 中通过 springboot 应用程序从云运行到云 sql 进行连接。有人有一步一步的例子吗?

I can't connect in GCP by sql auth proxy from cloudrun to cloud sql by springboot application. Somebody have an example stepbystep?

我可以使用 sql 授权代理从本地机器配置连接,但是 我不能从云 运行 带有 hikaricp 的 springboot 应用程序到云 sql public ip 使用 unix socket。 有人有完整的例子吗? 我在 gcp 文档中读到,我不需要为 sql 身份验证代理创建 docker 来连接云 运行 云 sql.It 在您定义数据库连接时创建在云配置中 运行.

POM.xml 添加了以下依赖项:

    <dependency>
        <groupId>com.google.cloud.sql</groupId>
        <artifactId>mysql-socket-factory</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

我设置了它,接下来我在应用程序中定义了以下应用程序属性(通过经典 jdbc 可以很好地在云中添加我的 ip sql 以允许连接,但我需要使用 sql auth proxy by unix socket to avoid to add a vpc, hikariCP:

我不会解释太长太无聊的原因)
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///DBSCHEMA
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.socketFactory=com.google.cloud.sql.mysql.SocketFactory
spring.datasource.cloudSqlInstance=GCP_PROJECT:GCP_REGION:DBNAME
spring.datasource.ipTypes=PUBLIC

logging.level.com.zaxxer.hikari=TRACE

有人可以帮我举一些工作正常的例子吗? 如果在您的示例中为 sql 身份验证代理创建了 docker,请对其进行解释。 在互联网上我找不到资源清楚地谈论这个配置。

非常感谢。

Cloud 运行 设置了一个 unix 套接字,因此您需要使用一个使用该 unixSocketPath 的路径。

jdbc:mysql:///<DATABASE_NAME>?unixSocketPath=</PATH/TO/UNIX/SOCKET>&cloudSqlInstance=<INSTANCE_CONNECTION_NAME>&socketFactory=com.google.cloud.sql.mysql.SocketFactory&user=<MYSQL_USER_NAME>&password=<MYSQL_USER_PASSWORD>

a Cloud 运行 unixsocket 路径如下:

/cloudsql/{connection_id}

{connection_id} 可能有这样的格式:GCP_PROJECT:GCP_REGION:DBNAME

所以基本上在你的 connectionString 中,你应该有:

?unixSocketPath=/cloudsql/myproject:us-central1:my_instance

解决方案:

  1. 为服务帐户典型名称创建 json 密钥:

    GCP_PROJECT_ID-GCP_ID_SERVICE_ACCOUNT-compute_developer_gserviceaccount_com

    并将 json 密钥文件保存在资产目录中(在 java 项目的根目录下) entrypoint.sh.

  2. 在 DockerFile 中为 json 服务帐户密钥添加行:

    运行 导出 GOOGLE_APPLICATION_CREDENTIALS=assets/GCP_PROJECT_ID-GCP_ID_SERVICE_ACCOUNT-compute_developer_gserviceaccount_com-GCP_KEY.json

  3. pom.xml 在下方添加:

用于sql auth proxy unix socket

<dependency>
    <groupId>com.google.cloud.sql</groupId>
    <artifactId>mysql-socket-factory</artifactId>
    <version>1.3.0</version>
</dependency>
<dependency>
    <groupId>com.google.api-client</groupId>
    <artifactId>google-api-client</artifactId>
    <version>1.32.1</version>
</dependency>

连接器mysql:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
  1. In application.properties 或 application-test.properties(如果您使用 spring 配置文件部署在 TEST GCP 云 运行):

    spring.datasource.url=jdbc:mysql://google/DB_SCHEMA?cloudSqlInstance=GCP_PROJECT_ID:GCP_REGION:DB_ISTANCE&socketFactory =com.google.cloud.sql.mysql.SocketFactory&useSSL=false

    spring.datasource.username=*****

    spring.datasource.password=*****

  2. 部署解决方案

我将使用 gitlab 变量,我将传递 url、用户名和密码,但这是其他工作...

N.B.: com.google.cloud.sql.mysql.SocketFactory告诉你使用unix socket! Cloud 运行 启动时启动 sql auth proxy if in cloud 运行 配置中的连接部分设置数据库(如果在同一个项目中,如果在其他项目中,您将看到一个替代的下拉列表您将手动添加 GCP_PROJECT:GCP_REGION:DB)。 您可以定义多个数据库来连接,但这是另一项工作 ;)