我创建了一个 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 效果非常好。我错过了什么吗?我有一种感觉,我位于私有子网中,但我不知道如何更改子网设置以将其公开。
数据库通常在私有子网中启动,以添加另一层保护。根据定义,私有子网中的任何内容都无法通过 Internet 直接访问。
您似乎有:
您可以通过 SSH 访问 EC2 实例,因为它可以访问 Internet,并且您可以从那里连接到数据库,因为 只要安全组允许,VPC 内的所有资源都可以相互通信。
Amazon RDS 数据库上还有另一个相关设置。您的数据库可能设置为Publicly available = No
,这意味着数据库的 DNS 名称 (URL) 将仅解析为私有 IP 地址。该地址只能从 VPC 内部访问。所以,你有两个选择:
选项 1:使用端口转发
ssh -i key.pem [email protected]
但是您可以添加端口转发:
ssh -i key.pem -L 5432:greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com:5432 [email protected]
这表示:“通过 SSH 连接转发本地端口 5432。连接另一端的计算机应将流量转发到 greengainsdb.cfyqeu2ws1b6.us-west-2.rds.amazonaws.com:5432
。”这将允许您在不影响安全性的情况下连接到私有数据库,并且是推荐的方法。事实上,许多 SQL 客户端允许您将 SSH 端口转发配置为数据库连接的一部分,因此它们会为您执行上述命令。
选项 2:公开您的数据库
Publicly Available = Yes