如何排查在尝试访问 Amazon RDS 数据库实例时 Lambda 中的连接超时错误?

上次更新日期:2021 年 4 月 19 日

我的 AWS Lambda 函数在尝试访问 Amazon Relational Database Service (Amazon RDS) 数据库实例时收到连接超时错误。如何排查这些错误?

解决方法

排查间歇性和和临时性连接超时错误

捕获 Lambda 函数的事件并重试,以此作为函数错误处理的一部分

有关更多信息,请参阅 AWS Lambda 中的错误处理和自动重试

检查 DNS 错误

确认它们是否是与任何域名系统 (DNS) 相关的错误。如果存在 DNS 错误,则捕获它们。然后,请使用指数回退算法重试 DNS 请求。有关更多信息,请参阅 AWS 中的错误重试和指数回退

注意:在重试 DNS 请求之前,请确保您能够解析入站和出站终端节点。

排查持续连接超时错误

检查 Lambda 函数的 Amazon CloudWatch Logs

如果您尚未向 Lambda 函数授予 CloudWatch 日志记录权限,则执行此操作。然后检查函数的日志,以识别特定连接超时错误。

有关更多信息,请参阅对基于 Lambda 的应用程序进行监控和问题排查

检查 VPC 配置

对于私有数据库,请根据您的使用案例执行以下操作之一:

将您的 Lambda 函数置于与数据库相同的 Amazon Virtual Private Cloud(Amazon VPC)中

-或者-

在包含您的函数的 Amazon VPC 与包含您的数据库的 Amazon VPC 之间创建 VPC 对等连接

对于公共数据库,请执行以下操作:

(对于 Amazon VPC 中的函数)通过网络地址转换(NAT)网关NAT 实例路由公共流量。有关更多信息,请参阅如何为连接到 Amazon VPC 的 Lambda 函数提供互联网访问权限?

注意:如果数据库可公开访问并且数据库没有基于 IP 地址的限制,则请按照教程:配置 Lambda 函数以访问 Amazon VPC 中的 Amazon RDS 中的说明进行操作。

检查安全组规则

对于私有数据库,请执行以下操作:

数据库安全组添加入站规则,以允许来自 VPC 子网安全组的 CIDR 范围的流量。

对于公共数据库,请执行以下操作:

向数据库安全组添加入站规则,以允许来自 VPC 的 NAT 网关NAT 实例的流量。

更新 Lambda 函数处理程序

更新您的 Lambda 函数代码,以确保函数会在函数处理程序以外打开数据库连接,并且不会关闭连接。

注意:由于 Lambda 重用容器的方式,在重用容器时,Lambda 不会重新初始化函数处理程序之外的代码。最佳做法是创建您计划在处理程序之外重用的连接,以便该连接在后续每次调用时仍然存在。在尝试使用该连接之前,请确保您确认存在有效连接。如果没有有效连接,则请先创建新的连接,然后再继续。

使用 EC2 实例连接

使用与 Lambda 函数相同的 Amazon VPC 配置启动一个 Amazon Elastic Compute Cloud(Amazon EC2)实例,以进行测试。然后尝试从该 EC2 实例连接到 Amazon RDS 数据库实例

如果您可以连接至该数据库,则请按照排查 Lambda 中的联网问题中的说明进行操作。

-或者-

如果您无法连接到该数据库,则按照如何解决连接到 Amazon RDS 数据库实例时出现的问题?中的说明进行操作。

使用 Amazon RDS Proxy

为您的 RDS 数据库创建一个 Amazon Relational Database Service (Amazon RDS) Proxy 终端节点,以处理来自 Lambda 函数的数据库流量。有关更多信息,请参阅读Using Amazon RDS Proxy with AWS Lambda

注意:对 MySQL 和 PostgreSQL 的Amazon RDS 代理支持现已全面开放