当前位置: 首页 > 知识库问答 >
问题:

从VPC境内的Ec2实例连接到RDS实例

微生昌勋
2023-03-14

背景:

我有一个具有 2 个私有子网的自定义 VPC,其中包含一个位于美国西部 2 区域内的 Postgres RDS 实例,以及一个包含美国西部 2 区域内 EC2 实例的公有子网。

专用子网ACL:

    < li >允许端口5432上的所有入站IPv4流量

RDS 实例安全组:

    < li >允许端口5432上的所有入站IPv4流量

公有子网 ACL:

  • 允许所有端口上的所有入站/出站流量

公共子网在其路由表中有一个互联网网关

EC2实例安全组:

  • 允许来自端口22上本地IP的入站SSH流量
  • 允许端口5432、443和80上的所有IPv4出站流量

在SSH进入EC2实例后,我导出与RDS实例的Postgres凭据关联的环境变量(例如PGDATABASE=testdb,PGUSER=foo_user,PGHOST=identifier.cluster-foo.us-west-2.RDS.amazonaws.com,PGPASSWORD=bar),并使用python版本3.7.10运行以下python脚本:

import psycopg2

try:
    conn = psycopg2.connect(connect_timeout=10)
    cur = conn.cursor()
    cur.execute("""SELECT now()""")
    query_results = cur.fetchall()
    print(query_results)
except Exception as e:
    print("Database connection failed due to {}".format(e))    

我收到以下超时错误:

Database connection failed due to connection to server at "foo-endpoint" (10.0.102.128), port 5432 failed: timeout expired
connection to server at "foo-endpoint (10.0.101.194), port 5432 failed: timeout expired

共有2个答案

赫连宏伯
2023-03-14

通常,网络访问控制列表(NACL)应保留其默认“允许所有入站”

NACL是有状态的,这意味着它们需要允许双向流量。这与安全组不同,后者是无状态的,允许返回流量发出以响应允许的入站流量。安全组可以配置为零出站规则,但仍允许用户连接到资源并接收响应。

您的场景的正确安全配置应该是:

  • 亚马逊 EC2 实例 (EC2-SG) 上的安全组,允许从您的 IP 地址进行入站 SSH 访问(端口 22)
  • 亚马逊 RDS 数据库 (DB-SG) 上的一个安全组,它允许从 EC2-SG 进行入站后显式登录 (端口 5432)

也就是说,DB-SG应该特别引用允许入站访问的EC2-SG。这是最安全的配置,因为数据库只能从与EC2-SG关联的EC2实例访问。如果该实例被替换为另一个EC2实例,如果它与EC2-SG关联,它仍然能够连接。

请注意,EC2-SG不需要安全组中的任何出站规则,因为它可以自动响应任何入站请求。但是,通常建议保留默认出站规则,以便实例上运行的软件可以访问Internet(例如,安装psycopg2库)。由于您自己安装了该软件,因此通常可以信任实例具有对Internet的出站访问权限。

闻深
2023-03-14

您是否检查过 VPC 的 DNS 主机名是否已启用?这更可能是由于无法解析同一子网中的 DNS(知道 RDS 的安全组欢迎来自任何地方的 Postgres 流量)。

除此之外,我还建议将 EC2 的安全组列入 RDS 安全组的安全组,即 Postgres 的端口。您可以看下图:

 类似资料:
  • 问题内容: 我们有许多应用程序使用一个位于VPC外部(经典实例)的ElasticCache实例(Redis)。一些应用程序位于VPC中,而某些应用程序位于VPC外部(经典实例)。我们如何将所有应用程序连接到缓存? 我们将VPC外部的应用程序连接到缓存没有问题,因为缓存也位于VPC外部。VPC内部的应用程序数量较少,无法连接到缓存。 谢谢。 问题答案: 无法从VPC实例直接访问经典群集。解决方法是在

  • 问题内容: 我正在尝试从EC2实例i-78a8df00连接到RDS实例mysql。**。us- east-1.rds.amazonaws.com。他们俩都在美国东部地区。我将EC2实例的安全组(sg- **)添加到RDS安全组,但这无济于事。这似乎是防火墙/ DNS问题,因为运行此命令时超时: 错误2003(HY000):无法连接到“ mysql。**。us- east-1.rds.amazona

  • 从EC2实例i-78a8df00中,我正在尝试连接到RDS实例他们都在美国东部地区。我将EC2实例的安全组(SG-*********)添加到RDS安全组中,但这没有帮助。运行此命令时超时,可能是防火墙/DNS问题: 错误2003(HY000):无法连接到“ 我可以从我的本地机器使用与上面相同的线路连接到RDS实例。我尝试了各种论坛解决方案,但那些都没有帮助。

  • 问题内容: 在AWS中,我设置了带有堡垒主机的VPC。堡垒主机是具有公共地址槽的单个EC2实例,您可以将其SSH到VPC上的任何其他服务器。 我已经在VPC中创建了一个RDS MySQL实例,我想使用MySQL工作台连接到它。我已按照此处详细说明的步骤进行操作,但是在“步骤6:设置远程SSH配置”中,它要求我“提供Amazon EC2实例的公共DNS”(即堡垒主机)。 然后,MySQL工作台会检查

  • 我有一个专有网络,在每个AZ为我的EC2提供专用子网。在专有网络中,我的ElastiCache(Redis)实例也有专用子网。设置是这样的 我还有安全组和NACL来控制对子网中资源的访问 当我想从运行在其中一个EC2实例上的程序访问ElastiCache群集时,我必须指定群集endpoint-例如: 我知道,使用读卡器endpoint可以实现读卡器实例之间的负载平衡,但由于所有资源都位于同一VPC

  • 我已经创建了AWS ec2实例并关联到一个安全组。在关联的安全组中,我已经向所有人开放了HTTP(HTTP, TCP,80,0.0.0.0/0)、SSH(SSH, TCP,22,0.0.0.0/0)和ICMP(All ICMP, All, N/A,0.0.0.0/0)。 但当我尝试ping到实例时,它失败了;给出请求超时。入站规则设置 此外,使用PuTTY或openssh连接到实例也会失败。它给出