【问题标题】:Connect to RDS instance from Ec2 instance within VPC从 VPC 内的 Ec2 实例连接到 RDS 实例
【发布时间】:2022-01-25 12:05:09
【问题描述】:

背景:

我有一个自定义 VPC,其中有 2 个私有子网,其中包含一个位于 us-west-2 区域内的 Postgres RDS 实例和一个包含一个位于 us-west-2 区域内的 EC2 实例的公有子网。

私有子网 ACL:

  • 允许端口 5432 上的所有入站 IPv4 流量

RDS 实例安全组:

  • 允许端口 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

【问题讨论】:

  • 为什么要修改 ACL?通常默认的就足够了。此外,您还没有为 ACL 提供出站规则。
  • @Marcin,是对的。默认的 NACL 足以建立连接,只需将它们重置为默认状态。
  • ACL 几乎肯定是问题所在。您还必须在 ACL 中打开临时端口。如果您不知道如何正确执行此操作,那么最好的解决方案是保留默认的 ACL 规则。
  • 将 ACL 恢复为默认值并在 VPC 中启用 DNS 可以解决问题,感谢您的提示

标签: amazon-web-services amazon-ec2 amazon-rds amazon-vpc


【解决方案1】:

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

除此之外,我还建议在 RDS 的安全组上将 ec2 的安全组 + Postgres 的端口列入白名单。你可以看看下面这张图:

【讨论】:

    【解决方案2】:

    一般来说,网络访问控制列表 (NACL) 应保留其默认的“允许所有入站和出站”设置,除非您有非常具体的网络要求(例如创建 DMZ)。

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

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

    • Amazon EC2 实例 (EC2-SG) 上的安全组,允许从您的 IP 地址进行入站 SSH 访问(端口 22)
    • Amazon RDS 数据库 (DB-SG) 上的一个安全组,允许来自 EC2-SG 的入站 PostgreSQL 访问(端口 5432)

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-01
      • 1970-01-01
      • 2014-05-09
      • 2013-05-26
      • 2016-10-30
      • 2019-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      相关资源
      最近更新 更多