如何配置 Lambda 函数以连接到 RDS 实例?
上次更新日期:2021 年 1 月 5 日
我希望我的 AWS Lambda 函数连接到 Relational Database Service (RDS) 实例。我该如何配置网络设置来做到这一点?
简短描述
要将 Lambda 函数连接到 RDS 实例,必须将每个函数上的联网配置设置为允许连接。
以下每种连接类型都有不同的配置设置:
- 同一个 Virtual Private Cloud (VPC) 中的 Lambda 函数和 RDS 实例
- 不同 VPC 中的 Lambda 函数和 RDS 实例
- Lambda 函数和公有 RDS 实例
有关如何配置 Lambda 函数的网络设置的信息,请参阅使用 Lambda 控制台配置 VPC 访问 。要将 Lambda 函数连接到 Aurora 数据库集群,请使用 Aurora Serverless 的数据 API。
注意:如果网络设置不正确,则 Lambda 函数将超时并显示任务超时错误消息。
解决方法
重要提示:确保更改以下示例中提供的每个 Port Range(端口范围)、Source(源)和 Destination(目的地)设置,以匹配您自己的网络配置。传输控制协议 (TCP) 是每种类型的网络配置所需的协议。
同一 VPC 中的 Lambda 函数和 RDS 实例
将 Lambda 函数连接到同一 VPC 中的 RDS 实例时,请使用以下网络配置。
注意:默认情况下,VPC 内的所有子网都包含本地路由。目的地是 VPC 的无类域间路由 (CIDR),目标为本地。有关更多信息,请参阅路由表。
1. 对于安全组,请使用以下网络设置之一:
对于附加到同一安全组的实例,请将安全组设为入站规则的源和出站规则的目的地。
例如,如果 Lambda 函数和 RDS 实例都在安全组 sg-abcd1234 中,则每个实例将具有以下入站和出站规则。
附加到同一安全组的实例的入站规则示例
类型 | 协议 | 端口范围 | 源 |
自定义 TCP | TCP | 3306 | sg-abcd1234 |
附加到同一安全组的实例的出站规则示例
类型 | 协议 | 端口范围 | 目的地 |
自定义 TCP | TCP | 3306 | sg-abcd1234 |
-或者-
对于不同安全组中的实例,请确保两个安全组都允许彼此访问。
例如,如果 Lambda 函数位于安全组 sg-1234 中,而 RDS 实例位于 sg-abcd 中,则每个组都将具有以下规则:
与要连接到的 RDS 实例不同的安全组中的 Lambda 函数的出站规则示例
类型 | 协议 | 端口范围 | 目的地 |
自定义 TCP | TCP | 3306 | sg-abcd |
与要连接的 Lambda 函数不同的安全组中 RDS 实例的入站规则示例
类型 | 协议 | 端口范围 | 源 |
自定义 TCP | TCP | 3306 | sg-1234 |
2. 对于网络访问控制列表 (NACL),请确保入站和出站规则允许 Lambda 函数与 RDS 实例之间的通信。
注意:默认情况下,NACL 允许所有的入站和出站流量。但是,这些默认设置可以更改。
配置 NACL 时,请执行以下操作:
确保与 RDS 实例和 Lambda 函数关联的每个子网的 NACL 允许到另一个实例的子网 CIDR 的出站 TCP 连接。
注意:以下示例使用四个通过 CIDR 标记的示例子网:
对于 Lambda 函数的子网,为 172.31.1.0/24 和 172.31.0.0/28。
对于 RDS 实例的子网,为 172.31.10.0/24 和 172.31.64.0/20。
Lambda 函数子网 NACL 的出站规则示例
类型 | 协议 | 端口范围 | 目的地 | 允许/拒绝 |
自定义 TCP | TCP | 3306 | 172.31.10.0/24 | 允许 |
自定义 TCP | TCP | 3306 | 172.31.64.0/20 | 允许 |
重要提示:同样的 出站规则也需要应用于 RDS 实例子网的 NACL,但其目的地设置为 Lambda 子网的 CIDR。
确保每个子网的 NACL 在其他实例子网 CIDR 范围内的临时端口上也有入站规则。
Lambda 函数子网 NACL 的入站规则示例
类型 | 协议 | 端口范围 | 源 | 允许/拒绝 |
自定义 TCP | TCP | 1024-65535 | 172.31.10.0/24 | 允许 |
自定义 TCP | TCP | 1024-65535 | 172.31.64.0/20 | 允许 |
重要提示:必须将相同的入站规则应用于 RDS 实例子网的 NACL,但其源设置为 Lambda 子网的 CIDR。
不同 VPC 中的 Lambda 函数和 RDS 实例
首先,使用 VPC 对等连接来连接两个 VPC。然后,使用以下网络配置将一个 VPC 中的 Lambda 函数连接到另一个 VPC 中的 RDS 实例:
重要提示:确保 VPC 对等连接已启用域名服务器 (DNS) 解析。
1. 对于路由表,通过查找以下内容来确认 VPC 对等连接成功完成:
对于目的地,请查找对等 VPC 的 CIDR。
对于目标,查找对等连接。
注意:以下示例包括两个由 CIDR 标记的示例子网:
对于对等的 VPC,该示例为 172.31.0.0/16。对于对等连接,为 pcx-01234abcd。
不同 VPC 中的 Lambda 函数和 RDS 实例的示例路由表
目的地 | 目标 |
172.31.0.0/16 | pcx-01234abcd |
10.0.0.0/16 | 本地 |
2. 对于安全组,请使用以下网络设置:
对于 Lambda 函数的安全组,请确保允许流量进出 RDS 实例的 VPC 的 CIDR。
注意:以下示例包括两个由 CIDR 标记的示例子网:
对于 RDS 实例,该示例为 172.31.0.0/16
对于 Lambda 函数,为 10.0.0.0/16
与 RDS 实例不同的 VPC 中的 Lambda 函数的出站规则示例
类型 | 协议 | 端口范围 | 目的地 |
自定义 TCP | TCP | 3306 | 172.31.0.0/16 |
与 Lambda 函数不同的 VPC 中的 RDS 实例的入站规则示例
类型 | 协议 | 端口范围 | 源 |
自定义 TCP | TCP | 3306 | 10.0.0.0/16 |
3. 对于 NACL,请按照上面的同一 VPC 中的 Lambda 函数和 RDS 实例部分中的步骤三的程序进行操作。Lambda 函数子网 CIDR 的来源位于不同的 VPC 中。
Lambda 函数和公有 RDS 实例
1. 确保已在 VPC 上启用了 DNS 路由。
2. 使用以下网络配置之一:
对于与公有 RDS 实例位于同一 VPC 中的 Lambda 函数,请参阅上面的同一 VPC 中的 Lambda 函数和 RDS 实例部分。
注意:Lambda 函数不需要互联网访问。它使用其私有 IP 地址解析 RDS。
-或者-
对于不同 VPC 中的 Lambda 函数和公有 RDS 实例,请参阅上面的不同 VPC 中的 Lambda 函数和 RDS 实例部分。
注意:不在 VPC 中的 Lambda 函数会自动接入互联网,并且可以解析公有 RDS 实例的 IP 地址。
3. 确保您的公有 RDS 配置符合以下条件:附加到 RDS 实例的子网是公有的(默认路由到 IGW)。所有 NACL 都允许所有入站和出站访问。安全组允许所有入站连接。
注意:如果要限制 NACL 访问,请确保 NACL 仍允许与 Lambda 的 VPC CIDR 或 EC2 CIDR 范围之间的连接。确保将出站连接设置为数据库的端口,并将入站连接设置为临时端口 (1024-65535)。如果需要限制安全组的入站访问,请确保该组仍允许从 Lambda 的 VPC CIDR 或 EC2 CIDR 范围进行入站访问。