首页 > 解决方案 > RDS上lambda函数与MySQL的连接问题

问题描述

我正在尝试从 AWS Lambda Python 函数访问 Amazon RDS 上的 MySQL 数据库。运行测试后,它给出了连接失败的错误:

“errorMessage”:“2019-05-27T15:14:26.967Z f6e8ae8d-1dfc-4be5-9e00-a2c937e4ca2c 任务在 3.00 秒后超时”

我相信这是由 VPC 或 NAT 或安全组的配置引起的。

我试图遵循:

但仍然无法正常工作

我有:

我的问题是:

根据这两个教程,我将需要一个 VPC,四个子网(1、2、3、4),前两个子网与访问本地和互联网网关的主路由表相关联。第二个子网与访问本地和 NAT 网关的“lambda-to-internet”路由表相关联。

NAT 网关应该与子网 1 关联。我正确吗?

对于网络 ACL,是否所有四个子网都关联同一个 ACL?

在 Lambda VPC 设置中,我是添加所有四个子网还是仅添加最后两个子网?

rds_host = "my_host_name"
name = "my_username"
password = "my_password"
db_name = "my_db_name"

conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)

标签: mysqlamazon-web-servicesaws-lambdaamazon-rds

解决方案


您的问题中有很多信息,因此很难全部回复,但您的基本问题似乎是如何允许 AWS Lambda 函数连接到 Amazon RDS 实例。

您的配置将需要是:

  • 配置为连接到 VPC 的 Lambda 函数(任何子网,没关系)
  • 在同一 VPC 中启动的 Amazon RDS 实例
  • Lambda 函数上的安全组 ( Lambda-SG) - 它不需要任何配置,但它需要存在
  • Amazon RDS 数据库实例上的安全组 ( RDS-SG),允许来自Lambda-SG端口 3306的入站流量

请注意,RDS-SG它允许从 连接Lambda-SG。一个安全组可以引用另一个安全组。

此外,增加 Lambda 函数的超时时间。它当前设置为 3 秒,这可能不足以完成您想要做的事情。连接超时设置为 5 秒,因此您需要 Lambda 函数运行时间超过此时间才能确认发生了什么。

这就是你所需要的。此设置不需要 NAT 网关。仅当您希望 Lambda 函数连接到 VPC并且能够连接到 Internet 时才需要。对于您所描述的内容,您只需要一个子网(用于 RDS 数据库实例),但您的架构可能需要更多用于您正在使用的其他资源。事件 Lambda 和 RDS 位不需要 Internet 网关。但是,专注于让 Lambda-RDS 连接正常运行,然后你就可以清理这些东西了。


推荐阅读