【问题标题】:Pool connection timeout - connecting to AWS RDS from EC2池连接超时 - 从 EC2 连接到 AWS RDS
【发布时间】:2020-12-26 15:35:42
【问题描述】:

我正在尝试使用 pg npm 包通过 NodeJS 应用程序从 EC2 服务器连接到 Amazon RDS (Postgres) 实例。我收到错误的错误(请注意,我正在通过反应应用程序访问我的节点后端): 选项 /users/login 200 0.424 毫秒 - 2 从池中获取客户端时出错错误:连接因连接超时而终止

我已在本地测试过该应用程序,一切正常(包括连接到 RDS),但在服务器上运行该应用程序后,我无法连接。

为了简化问题,我刚刚在 NodeJS 路由文件中明确输入了我的凭据,因此我知道环境变量等没有问题。然后我将我的代码推送到服务器,按原样拉取并运行它。没有运气。从连接的角度来看,我只是创建了一个池(需要来自 pg 的池),然后使用 pool.connect 和 client.query 来发出请求。

我觉得它在本地工作,我的网络/安全组的问题是 AWS 问题,但我觉得我已经尝试了所有方法:

  1. 确保数据库设置为公共
  2. 创建了一个新的安全组并将其添加到 EC2 和 RDS
  3. 完全打开端口(入站和出站)
  4. 创建 VPC 并添加到 EC2 和 RDS
  5. 已检查 VPC 子网 NACL 上的入站/出站是否打开

任何帮助将不胜感激。我要疯了

【问题讨论】:

  • 按池,您的后端在私有或公共子网中运行?
  • @Marcin 抱歉,我是 AWS 新手,不确定。我该如何检查?为了部署应用程序,我将前端和后端推送到我的 github,将整个东西拉到 ec2 实例上,然后像在本地一样使用 npm start 运行它

标签: node.js postgresql amazon-web-services amazon-ec2 amazon-rds


【解决方案1】:

连接到您的服务器并尝试使用 telnet 或 PostgreSQL 客户端调试连接。

此错误最常见的错误是:

  1. RDS 安全组不允许来自您的 VPC 范围或公共 EC2 服务器 IP(在公共数据库的情况下)的传入连接。
  2. RDS 子网不允许 NACL 中的传出连接。请记住,只有第一个连接发生在您在 RDS 中定义的端口中,其他连接发生在其他端口上;但是,一旦您说可以在本地连接,我认为这不是您的情况。
  3. RDS 路由表不允许来自 VPC 外部的连接。但是,我再次认为这不是你的情况。
  4. EC2 安全组不允许到 RDS 的传出连接。这种情况有点棘手,但如果您没有正确设置 SG,就会发生这种情况。
  5. 最后一种情况是您的EC2服务器子网不允许连接到互联网。您说可以在本地连接,所以我想您的RDS设置正确以允许公共连接;但是,您可能会遇到以下情况:您没有在 EC2 服务器路由表中连接 Internet 网关或 NAT 网关,或者没有正确配置 NACL 以允许来自 Internet 的入站/出站连接。

【讨论】:

  • 感谢@Raul Running telnet from server 返回:Connected to Escape character is '^]'. 是不是很奇怪它返回 EC2 路径而不是 RDS 路径?解决其他项目: 1. 相同的安全组应用于 EC2 和 RDS,并且我已经打开了所有端口范围 2. 我有规则 #100,所有协议/范围都设置为 ALLOW。还有一个叫做 * 的规则是 DENY?不知道这意味着什么? 3. 同意,我认为可以 4. 与 RDS 相同的安全组,所有端口都打开 5. EC2 子网路由表有目的地:,目标:local
  • 是的,这很奇怪;它应该显示 rds 主机路径。使用 dig 或 nslookup 命令检查您的 rds 主机路径 IP。
猜你喜欢
  • 2018-12-21
  • 1970-01-01
  • 2019-04-13
  • 2015-01-29
  • 2016-04-23
  • 2017-07-25
  • 1970-01-01
  • 2020-03-10
  • 2020-10-19
相关资源
最近更新 更多