AWS Lambda 到 RDS PostgreSQL

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

各位 AWS 贡献者,大家好,我目前正在开发一个项目,以设置一个将 Lambda 函数连接到 RDS 上托管的 PostgreSQL 数据库的示例。我在本地测试了我的 Python + SQL 代码(在 VS code 和 DBeaver 中),它在仅包含基本凭据(主机、数据库名、用户名密码)的情况下工作得非常好。然而,当我将代码粘贴到 Lambda 函数中时,它给了我各种各样的错误。我遵循这个模板并修改了我的代码以从秘密管理器检索凭据。

我目前正在使用 boto3、psycopg2 和秘密管理器来获取凭据并连接到数据库。

我收到的错误列表-

  1. 服务器意外关闭连接。这可能意味着服务器在处理请求之前或处理过程中异常终止
  2. 无法连接到服务器:连接超时。服务器是否在主机“db 端点”上运行并接受端口 5432 上的 TCP/IP 连接?
  3. 致命:主机“ip:xxx”、用户“userXXX”、数据库“dbXXX”没有 pg_hba.conf 条目,SSL 关闭

我尝试过的事情-

  1. RDS 和 Lambda 位于同一 VPC、同一子网、同一安全组。
  2. IP地址包含在入站规则中
  3. Lambda 函数设置为运行最多 15 分钟,但它总是在达到 15 分钟之前停止
  4. 我尝试了数据库端点和数据库代理端点,但都不起作用。

当我在本地运行代码时,我只需要提供主机、数据库名、用户名和密码,仅此而已,我就可以编写我想要的所有查询和函数,这对我来说并没有什么意义。但是当我将代码放入 lambda 函数时,它需要所有这些秘密管理器、VPC 安全组、SSL、代理、TCP/IP 规则等。有人可以解释为什么本地运行和在 lambda 上运行之间存在要求差异吗?

最后,有人知道我的设置可能有什么问题吗?我很高兴提供与此相关的任何信息,任何要研究的一般方向都会非常有帮助。谢谢!

python postgresql amazon-web-services aws-lambda amazon-rds
2个回答
2
投票

按照下面链接中的说明构建特定的 psycopg2 软件包,并验证 VPC 子网和安全组是否配置正确,为我解决了这个问题。

我使用 psycopg2 v2.9.3 for Python 3.7.10 在 Amazon Linux 2 AMI 实例上运行,为 PostgreSQL 10.20 构建了一个包。我必须对方向进行的唯一更改是在压缩之前将 psycopg2 目录放入 python 目录(即“python/psycopg2/”)中——在我这样做之前,Lambda 函数中的

import psycopg2
语句失败。

这是我使用的VPC场景。 Lambda 函数在公共子网和关联的安全组内执行。私有子网安全组的入站规则仅允许公有子网安全组到 5432 的 TCP 连接。


0
投票

看来你已经解决了你的问题,但我在让 Psycopg2 工作时遇到了麻烦,所以我想我会分享我在另一篇文章中找到的替代方案...

Pg8000 非常容易上手: https://github.com/tlocke/pg8000

无需构建二进制文件或将巨大的包推送到 lambda 层。也许其他人也会受益。

干杯!

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