我正在尝试从 Python 运行时 Lambda 函数连接到 RDS 实例。
RDS 和 Lambda 位于不同的 VPC 中。我已使用
VPC Peering
连接两个 VPC,并确认使用 EC2 实例对等互连成功。
我的 VPC A 位于
CIDR 172.31.0.0/16
,
VPC B 位于 CIDR 10.1.0.0/16
。
SG 是使用 CIDR 配置的,路由也是如此。
路由表具有这样的条目
VPC A路由表:
目的地
10.1.0.0/16
pcx-xxxxxxx
VPC B 路由表:
目的地
172.31.0.0/16
pcx-xxxxxxx
目的地
10.2.0.0/16
pcx-1234567
VPC A 的 SG
Inbound
Type - MYSQL/ Aurora
Protocol - TCP
Port - 3306
Source - 10.1.0.0/16
VPC B 的 SG
Outbound
Type - All traffic
Protocol - All
Port - All
Destination - 172.31.0.0/16
VPC B 还使用与不同区域中的不同 VPC 的 VPC 对等,以访问 RDS 以外的不同服务。 在 Lambda 中,我可以使用
boto3
访问该服务
当我尝试使用 pymysql
连接到 RDS 时,pymysql.connect
超时。我尝试为 RDS 创建一个 VPC 终端节点接口并将其用作我连接的终端节点,但这也不起作用。
如果我为 lambda 提供互联网访问权限,那么我可以访问 RDS 实例,但我不想使用该解决方案。
我认为问题在于你有
Publicly Accessible = Yes
。
来自 使用 VPC 中的数据库实例 - Amazon Relational Database Service:
当您在 VPC 内启动数据库实例时,该数据库实例具有用于 VPC 内流量的私有 IP 地址。此私有 IP 地址不可公开访问。您可以使用公共访问选项来指定数据库实例除了私有 IP 地址之外是否还具有公共 IP 地址。如果数据库实例被指定为“可公开访问”,则其 DNS 终端节点将解析为 VPC 内的私有 IP 地址。 它从 VPC 外部解析为公共 IP 地址。
这意味着 Lambda 函数(在 VPC B 中)会将 RDS DNS 名称解析为公共 IP 地址,该地址无法通过 VPC 对等连接进行路由。
您可以设置
Publicly acccessible = No
(更安全),或通过 Internet 连接,或以某种方式将 RDS DNS 名称解析为专用 IP 地址,使用它进行连接。 (不确定您将如何从 VPC B 执行此操作。)