使用 VPC 对等互连使用 pymysql 连接到 Python 中的 RDS

问题描述 投票:0回答:1

我正在尝试从 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 实例,但我不想使用该解决方案。

amazon-web-services aws-lambda amazon-rds amazon-vpc vpc-endpoint
1个回答
0
投票

我认为问题在于你有

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 执行此操作。)

    

© www.soinside.com 2019 - 2024. All rights reserved.