Strapi部署至Google App Engine连Cloud SQL报EAI_AGAIN错误
Strapi 部署至 Google App Engine 连接 Cloud SQL 报错解决方案
报错核心原因
运行时抛出的getaddrinfo EAI_AGAIN /cloudsql/connectionName错误,本质是MySQL连接器错误将Cloud SQL的Unix套接字路径作为网络主机名发起DNS解析,因该路径不存在于DNS解析规则中,最终解析失败导致应用无法启动。
注意:对MySQL驱动来说,Unix套接字路径不能通过host字段传入,否则会被当做主机名触发无效的DNS查询。
可落地的修正步骤
1. 调整数据库连接配置的套接字传参逻辑
原配置将Cloud SQL的Unix套接字路径写入host字段,不符合MySQL驱动的参数规则,需要将套接字路径单独迁移至socketPath配置项:
修正后的数据库连接配置:
module.exports = ({ env }) => ({ defaultConnection: 'default', connections: { default: { connector: 'bookshelf', settings: { client: 'mysql', database: env('DATABASE_NAME'), username: env('DATABASE_USERNAME'), password: env('DATABASE_PASSWORD'), // 单独将Cloud SQL套接字路径配置到socketPath字段 socketPath: `/cloudsql/${env('INSTANCE_CONNECTION_NAME')}`, }, }, }, });
2. 校验App Engine部署配置的一致性
逐一核对app.yaml中的Cloud SQL实例配置,确保无以下问题:
- 环境变量
INSTANCE_CONNECTION_NAME的取值格式必须为GCP项目ID:实例所在区域:Cloud SQL实例ID,无拼写错误、多余空格 beta_settings.cloud_sql_instances的配置值,必须和上述环境变量的取值完全一致,不能存在字符缺漏
参考修正后的yaml配置:
runtime: nodejs12 instance_class: F2 env_variables: HOST: '0.0.0.0' NODE_ENV: 'production' DATABASE_NAME: 'test' DATABASE_USERNAME: '数据库用户名' DATABASE_PASSWORD: '数据库密码' INSTANCE_CONNECTION_NAME: '你的Cloud SQL完整连接名' beta_settings: cloud_sql_instances: '和上面相同的Cloud SQL完整连接名'
3. 排查Cloud SQL侧的权限与网络限制
- 确认App Engine绑定的服务账号,已被授予Cloud SQL客户端权限(
roles/cloudsql.client) - 确认Cloud SQL实例未配置强制公网连接规则,允许App Engine通过内置的Cloud SQL Auth Proxy通道接入
4. 依赖版本兼容校验
- 检查项目内
mysql2、bookshelf依赖版本,确认对socketPath参数的支持正常,无已知兼容bug - 现有使用的
nodejs12运行时已停止社区维护,长期建议升级到受Google App Engine支持的LTS版本运行时,减少未知兼容问题
内容的提问来源于stack exchange,提问作者David Reyes
相关产品推荐
相关产品推荐

