已开启公网访问和全量入站规则,仍无法连接Amazon RDS PostgreSQL数据库
问题描述
我创建了一个PostgreSQL RDS数据库实例并关联了EC2实例,能够通过SSH连接到EC2实例并在其中访问该数据库,但无法使用psql或Prisma直接连接数据库。
使用Prisma时出现错误:
Environment variables loaded from .env Prisma schema loaded from prisma/schema.prisma Datasource "db": PostgreSQL database "postgres", schema "public" at "greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com" Error: P1001: Can't reach database server at `greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com`:`5432` Please make sure your database server is running at `greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com`:`5432`.
使用psql时的错误:
psql --host=greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=postgres Password: psql: error: connection to server at "greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com" (35.155.218.201), port 5432 failed: Operation timed out Is the server running on that host and accepting TCP/IP connections?
已尝试将安全组设置为允许任意IP的TCP连接,但仍无法连接。SSH连接EC2正常,怀疑数据库处于私有子网但不知如何修改为公开子网。
解决方案
1. 检查RDS实例的「公有可访问性」设置
这是最容易忽略的核心配置:
- 登录AWS控制台进入RDS服务,找到目标实例
- 切换到「配置」标签页,查看「公有可访问性」选项
- 若显示为「否」,修改为「是」并保存,等待实例重启生效
2. 处理私有子网问题
RDS无法直接更改所属子网,需通过快照迁移或使用SSH隧道两种方式解决:
方式A:迁移RDS到公有子网
- 为当前RDS实例创建手动快照
- 创建新的子网组,确保组内包含公有子网(公有子网的路由表需指向Internet Gateway)
- 使用快照恢复新的RDS实例,选择刚创建的公有子网组,同时开启「公有可访问性」
- 测试新实例的直接连接
方式B:通过SSH隧道间接连接(无需迁移RDS)
如果不想改动RDS子网,可利用EC2作为跳板建立隧道:
- 执行命令建立隧道(替换EC2公网IP和密钥路径):
ssh -L 5432:greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com:5432 ec2-user@<EC2公网IP> -i /path/to/your/key.pem -N - 保持终端窗口打开,本地用psql连接:
psql --host=localhost --port=5432 --username=postgres --password --dbname=postgres - Prisma的
DATABASE_URL修改为:DATABASE_URL="postgresql://postgres:你的密码@localhost:5432/postgres?schema=public"
3. 二次验证安全组与网络ACL
- 确认RDS安全组的入站规则:开放5432端口、TCP协议、允许目标IP段(或0.0.0.0/0)
- 检查RDS所在VPC的网络ACL:确保入站/出站规则允许5432端口的流量(默认ACL为全通,若有自定义规则需排查)
内容的提问来源于stack exchange,提问作者Vibhore Sagar
相关产品推荐
相关产品推荐

