Spring Boot(Cloud Run)通过Unix Socket连接Cloud SQL(IAM认证)报错求助
问题描述
将Spring Boot应用部署在GCP Cloud Run上,计划通过Cloud SQL Proxy的IAM认证方式,使用Unix Socket而非TCP连接Cloud SQL(PostgreSQL)。当前application.yml配置如下:
spring: cloud: gcp: sql: jdbc: enabled: false database-name: db-name enable-iam-auth: true instance-connection-name: instance-name datasource: url: jdbc:postgresql:///db-name?unixSocketPath=/cloudsql/instance-name/.s.PGSQL.5432&socketFactory=com.google.cloud.sql.postgres.SocketFactory&enableIamAuth=true&sslmode=disable&cloudSqlInstance=instance-name username: my-username password: "" type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 10
部署后日志显示已通过Unix Socket连接实例,但出现认证错误:
org.postgresql.util.PSQLException: The server requested password-based authentication, but no password was provided by plugin null
补充信息:若移除JDBC URL并启用GCP SQL自动配置,连接正常,但需求是使用Unix Socket连接。
依赖版本:
- Spring Cloud:2021.0.2
- Spring GCP:3.4.7
- GCP libraries:25.3.0
解决方案
1. 补充Socket Factory依赖
禁用Spring Cloud GCP自动配置后,需手动引入PostgreSQL的Cloud SQL Socket Factory依赖,确保IAM认证逻辑正常运行:
<dependency> <groupId>com.google.cloud.sql</groupId> <artifactId>postgres-socket-factory</artifactId> </dependency>
2. 修正JDBC URL与数据源配置
移除手动指定的unixSocketPath参数(Socket Factory会自动识别Cloud Run中挂载的Unix Socket路径),同时调整密码配置与SSL模式:
spring: cloud: gcp: sql: jdbc: enabled: false database-name: db-name enable-iam-auth: true instance-connection-name: instance-name datasource: url: jdbc:postgresql:///db-name?socketFactory=com.google.cloud.sql.postgres.SocketFactory&cloudSqlInstance=instance-name&enableIamAuth=true&sslmode=require username: my-username password: null type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 10
- 将
password设为null:避免驱动将空字符串视为无效密码,让Socket Factory自动生成IAM认证所需的临时凭证 - 调整
sslmode为require:PostgreSQL的IAM认证依赖SSL连接,之前的disable会导致认证流程异常
3. 验证Cloud SQL IAM用户配置
确保PostgreSQL实例中已创建对应IAM用户并授予权限:
CREATE USER "my-username" WITH LOGIN; GRANT cloudsqliamuser TO "my-username";
同时确认该IAM账号拥有Cloud SQL Client角色权限。
4. 检查Cloud Run服务账号权限
部署Cloud Run的服务账号需拥有Cloud SQL Client角色,确保能够生成IAM认证所需的临时凭证。
内容的提问来源于stack exchange,提问作者Heril Muratovic
相关产品推荐
相关产品推荐

