You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Heroku/Replit无法连接AWS上的MySQL数据库(node.js+mysql2场景)

Discord.js 托管在Replit/Heroku时连接AWS MySQL超时解决方案

核心原因

本地可正常连接数据库、托管平台连接超时,绝大多数情况是AWS侧的访问控制策略拦截了托管平台的访问请求,和代码本身逻辑关联度较低。

排查与修复步骤

1. 优先验证AWS RDS安全组配置

  • AWS RDS默认通过安全组限制3306端口的访问源,你本地可以连接是因为安全组已经放行了你本地的公网IP,而Replit、Heroku的出口IP不在允许列表中,请求被拦截直接触发超时。
  • 临时测试验证:将RDS关联安全组的入站规则中,3306端口的源地址临时设置为0.0.0.0/0(IPv4)和::/0(IPv6),测试托管平台的机器人是否可以正常连接。如果可以连通即可确认是安全组规则问题,测试完成后立刻删除该临时规则避免安全风险。

2. 对应托管平台的长期修复方案

  • Replit场景:查询Replit官方公布的出口IP段,将所有IP段添加到AWS安全组的3306端口入站允许列表中即可。
  • Heroku场景:Heroku的出口IP为动态地址,可选择使用Heroku的固定IP类附加组件获取固定出口IP,将该IP添加到安全组允许列表;也可选择在AWS侧新增API接口层,机器人通过HTTP请求调用接口操作数据库,避免直接暴露3306端口到公网。

3. 代码逻辑优化

你当前的代码存在重复创建连接池的问题,每次调用query函数都会新建一个连接池,不必要的资源开销也可能引发连接异常,优化后的参考代码如下:

const mysql = require('mysql2/promise');
// 全局仅初始化一次连接池
const pool = mysql.createPool({
    host: process.env['host'],
    user: 'admin',
    password: process.env['chave'],
    database: 'prdcorridas_main',
    port: 3306,
    waitForConnections: true,
    connectionLimit: 20,
    queueLimit: 0
});

async function query(sql) {
    const [results] = await pool.query(sql);
    return results;
}

module.exports = { query }

4. 额外排查项

  • 确认Replit、Heroku部署环境的环境变量配置正确,host和chave的取值和本地使用的完全一致,无拼写错误、多余空格或引号。
  • 确认RDS实例已开启公开访问权限,可在RDS控制台的连接性配置页查看该选项状态。
  • 可在托管平台的运行环境中执行端口连通性测试,确认3306端口的网络可达性,进一步定位问题层级。

内容的提问来源于stack exchange,提问作者bhaskaral7 dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:15:02