Google Cloud SQL 间歇性IAM认证失败引发服务超时问题
问题根因与处置方案
问题现象
- 单实例常驻运行的App Engine Flex Java REST后端服务,通过服务账号IAM认证方式连接Cloud SQL Postgres实例,绝大多数时段运行正常,偶发REST调用超时,触发服务端及客户端拒绝服务。
- 近7天GCP日志累计出现7365次JDBC连接获取失败错误,发生频次极高:
org.springframework.dao.DataAccessResourceFailureException: Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
- 服务与数据库均无明显资源瓶颈:App Engine实例配置为1vCPU、4GB内存,CPU峰值80%但与超时时段不重合,内存占用始终低于1.5GB;Cloud SQL实例配置为1vCPU、3.75GB内存,CPU使用率稳定在5%左右,内存占用约2GB,每秒事务数不超过6。
- Cloud SQL实例本身运行正常,报错指向IAM服务账号凭证校验失败,数据库侧日志如下:
2022-06-16 08:33:33.316 UTC [610407]: [1-1] db=db-dev,user=connect-xxx@appspot FATAL: Cloud SQL IAM service account authentication failed for user "connect-xxx@appspot" 2022-06-16 08:33:33.316 UTC [610407]: [1-1] db=db-dev,user=connect-xxx@appspot DETAIL: Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. Connection matched pg_hba.conf line 21: "local all +cloudsqliamserviceaccount cloudsql-iam-svc-acct"
已排除的排查方向
- 排除Cloud SQL实例可用性问题:实例无重启、故障切换记录,资源水位始终处于健康区间。
- 排除Cloud SQL Auth Proxy运行异常:Proxy启动流程正常,端口监听规则生效,运行期间无错误日志输出。
Proxy启动日志与端口监听状态如下:
# Proxy启动日志 2022/06/21 15:44:23 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here. 2022/06/21 15:44:24 Listening on 0.0.0.0:3306 for connect-xxx:europe-west9:dev 2022/06/21 15:44:24 Ready for new connections 2022/06/21 15:44:24 Generated RSA key in 731.70246ms # 端口监听状态 systemd-r 246 systemd-resolve 14u IPv4 13413 0t0 TCP 127.0.0.53:53 (LISTEN) container 345 root 11u IPv4 14603 0t0 TCP 127.0.0.1:45795 (LISTEN) sshd 422 root 3u IPv4 14545 0t0 TCP *:22 (LISTEN) sshd 422 root 4u IPv6 14546 0t0 TCP *:22 (LISTEN) dockerd 447 root 27u IPv4 17276 0t0 TCP 172.17.0.1:3306 (LISTEN)
- 排除连接配置错误:
- HikariCP连接池配置正确,IAM认证开关已开启:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP" /> <property name="connectionTestQuery" value="SELECT 1" /> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="connectionTimeout" value="600000"/> <property name="jdbcUrl" value="jdbc:postgresql://127.0.0.1:3306/db-dev?cloudSqlInstance=connect-xxx:europe-west9:dev&socketFactory=com.google.cloud.sql.postgres.SocketFactory" /> <property name="username" value="connect-xxx@appspot"/> <!-- IAM auth --> <property name="password" value="dummy"/> <property name="dataSourceProperties"> <props> <prop key="sslmode">disable</prop> <prop key="enableIamAuth">true</prop> </props> </property> </bean>
- app.yaml中Cloud SQL实例连接规则配置正确,端口映射与JDBC连接串一致:
beta_settings: cloud_sql_instances: connect-xxx:europe-west9:dev=tcp:3306
- Postgres Socket Factory依赖版本为1.6.0,符合官方使用规范:
<dependency> <groupId>com.google.cloud.sql</groupId> <artifactId>postgres-socket-factory</artifactId> <version>1.6.0</version> </dependency>
最终根因
经Google官方确认,该问题属于GCP平台侧IAM认证模块偶发的令牌校验故障,不属于用户侧代码、配置或资源问题,官方将在问题确认后数周内推出全平台修复版本。
官方修复上线前的临时缓解方案
- 调整HikariCP连接参数:将
connectionTimeout从当前的600000ms(10分钟)下调至30000ms以内,避免连接获取失败时长时间阻塞业务线程,放大故障影响;将maxLifetime设置为30分钟以内,强制连接池定期重建连接,减少绑定无效令牌的长连接占比。 - 在JDBC操作层增加轻量重试逻辑,捕获
JDBCConnectionException时自动重试1-2次,屏蔽偶发认证失败对上层业务的影响。 - 若故障影响严重,可临时切换为Postgres内置用户密码认证模式,待官方修复上线后再切回IAM服务账号认证。
内容的提问来源于stack exchange,提问作者nnl
相关产品推荐
相关产品推荐

