mysql - 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 或安全组的配置引起的。
我试图遵循:
但仍然无法正常工作
我有:
- 连接了一个 Internet 网关的默认 VPC
- 2 个具有 IPv4 CIDR
xxx.xx.0.0/20
(subnet001) 和xxx.xx.16.0/20
(subnet002) 的子网与一个路由表和一个网络 ACL 关联。 - 与 subnet001 关联的 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)
解决方案
您的问题中有很多信息,因此很难全部回复,但您的基本问题似乎是如何允许 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 连接正常运行,然后你就可以清理这些东西了。
推荐阅读
- python - Discord.py 机器人不阅读其他机器人的消息
- ruby-on-rails - 巫术认证系统不工作,找不到动作
- python - Pandas DataFrame,计算满足条件的一行与另一行之间的时间差
- c# - 从 Oracle SP 的数组表参数返回数据
- lotus-notes - Lotus Notes 部署
- python - 如何从另一个文件更新变量
- stripe-payments - Laravel 5.6 - 条纹错误:您没有设置有效的可发布密钥
- javascript - 如何在 React 的嵌套组件场景中使页脚与中心对齐
- dask - 有没有办法在脚本中为 Dask YarnCluster 更新而不是覆盖 worker_env?
- asp.net-mvc - 实体框架更新后缺少某些对象值