无法使用AWS Lambda写入数据库

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

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

调用invoke 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写入数据库?

python pandas amazon-web-services aws-lambda
1个回答
0
投票

我假设Postgres实例在RDS中。

您的lambda是否在VPC中?您可以在管理控制台中VPC框中的功能页面上进行检查。默认情况下不是,并且VPC框中显示“无”。

情况1:Lambda不在VPC中

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

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

案例2:Lambda在VPC中

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

现在您需要做的所有事情(前提是您没有触摸其他网络配置)是确保RDS实例的安全组允许从lambda的安全组进行访问。因此,您可以将它们都放在默认安全组中,也可以将它们放在单独的组中,但要确保RDS拥有允许lambda的入站规则。

[请注意,如果您的lambda还需要调用外部服务(因为提到了查询API),为了启用它,在将其链接到您的VPC之后,您还需要创建一个NAT网关,如我在此处所述:[ C0]

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