部署GCP App Engine后无法连接Cloud SQL,提示ETIMEDOUT错误
App Engine Flex连接Cloud SQL超时问题修复
核心问题
你遇到的ETIMEDOUT错误,根源是代码里同时配置了host(公网IP)和socketPath(Cloud SQL套接字),导致Sequelize优先尝试通过公网IP连接,而App Engine Flex环境下这种方式会被网络限制拦截,最终超时。本地用Auth Proxy正常是因为代理帮你处理了连接路径,和部署环境的连接逻辑完全不同。
修复方案
1. 调整Sequelize连接配置
删掉host参数,只保留socketPath——App Engine Flex通过Cloud SQL套接字连接时不需要公网IP:
const Sequelize = require("sequelize").Sequelize; const dotenv = require("dotenv"); dotenv.config(); const sequelize = new Sequelize( process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, { dialect: "mysql", socketPath: process.env.INSTANCE_CONNECTION, // 格式必须是 `/cloudsql/[项目ID]:[区域]:[实例名]` } ); module.exports = { sequelize };
2. 修正app.yml的实例连接名
beta_settings里的cloud_sql_instances不需要加/cloudsql/前缀,直接填完整的实例连接名:
runtime: nodejs env: flex runtime_config: operating_system: "ubuntu22" runtime_version: "18" beta_settings: cloud_sql_instances: "你的项目ID:实例区域:实例名称"
3. 确认服务账号权限
检查App Engine默认服务账号([项目ID]@appspot.gserviceaccount.com)是否拥有Cloud SQL Client角色,没有的话去IAM页面添加这个角色——否则应用没有权限访问Cloud SQL实例。
4. 验证环境变量
确保部署时INSTANCE_CONNECTION环境变量的值是/cloudsql/你的实例连接名,和app.yml里的实例名完全对应。可以通过命令行部署时设置:
gcloud app deploy --set-env-vars INSTANCE_CONNECTION=/cloudsql/你的项目ID:实例区域:实例名称
或者在App Engine控制台的“环境变量”面板里配置。
额外提醒
- App Engine Flex会自动把Cloud SQL实例的套接字挂载到
/cloudsql/目录,所以代码里的socketPath必须严格对应这个路径 - 不要同时启用
host和socketPath,否则Sequelize会优先走公网IP连接,触发超时
内容的提问来源于stack exchange,提问作者Agha Shayan
相关产品推荐
相关产品推荐

