首页 > 解决方案 > 无法使用 AWS Lambda 写入数据库

问题描述

我正在尝试使用 AWS Lambda 将文件写入 postgres 数据库,但我遇到了一个错误:

调用调用 API 操作失败并显示以下消息:网络错误

我的代码如下所示:

from sqlalchemy import create_engine
import pandas as pd

def test(event=None, context=None):
    conn = create_engine('postgresql://user:password@url:5439/database')

    df = pd.DataFrame([{'A': 'foo', 'B': 'green', 'C': 11},{'A':'bar', 'B':'blue', 'C': 20}])

    df.to_sql('your_table', conn, index=False, if_exists='replace', schema='schema')

test()

资源:内存 - 1280MB 超时 - 2 分钟

这里有什么问题,我还能如何使用 AWS Lambda 将 pandas Dataframe 写入数据库?

标签: pythonpandasamazon-web-servicesaws-lambda

解决方案


我假设 Postgres 实例在 RDS 中。

您的 lambda 在您的 VPC 中吗?您可以在管理控制台中的函数页面上的 VPC 框中检查这一点。默认情况下不是,VPC 框显示“无”。

案例 1:Lambda 不在 VPC 中

那么问题可能是与您的 RDS 实例关联的安全组不允许来自 VPC 外部的连接。如果您没有接触安全组,这是默认设置。从 RDS 管理员中找到您的 RDS 实例的安全组,然后查看该安全组的“入站规则”。Lambda 没有 IP,因此您需要添加一个入站规则,至少允许源“0.0.0.0/0”的 postgres 流量,即整个互联网。

这应该足够了,但请注意,这对于安全性来说并不是很好,因为理论上任何人现在都可以访问您的数据库(如果他们能猜出密码,情况会更糟)。但取决于您的项目,这对您来说可能不是问题。如果这对您来说是个问题,您可以改为将您的 lambda 与 RDS 实例所在的同一 VPC 关联,以提供更好的网络安全性,然后转到案例 2。

案例 2:Lambda 在 VPC 中

为简单起见,我假设您将 lambda 放在与 RDS 实例相同的 VPC 中 - 如果不是,您可能知道自己在做什么。

您现在需要做的(假设您没有接触其他网络配置)是确保您的 RDS 实例的安全组允许从您的 lambda 安全组进行访问。因此,您可以将两者都放在默认安全组中,或者将它们放在单独的组中,但要确保 RDS 具有允许 lambda 的入站规则。

请注意,如果您的 lambda 还需要调用外部服务(因为您提到查询 API),为了启用它,在将其链接到您的 VPC 后,您还需要创建一个 NAT 网关,就像我在此处描述的那样:https:/ /stackoverflow.com/a/61273118/299754


推荐阅读