python - 无法使用 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 写入数据库?
解决方案
我假设 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
推荐阅读
- r - 将 Tibble 带入 Data Frame 表单,列作为行和列索引
- shopware - 在新选项卡中显示自定义产品关联数据
- c# - 我可以在 Resharper 命令行工具中指定自定义命名样式吗?
- javascript - 我怎样才能拥有一个带有 Iframe/Html5 视频和阅读更多按钮的页面,其 src 和 href 值可以在 javascript 的帮助下更改?
- c# - C# /UWP /WPF : 缩小 SoftwareBitmap (RAW)
- c# - 如何在 C# 中创建加拿大邮政编码范围生成器
- github - 获取所有存储库查询 Github v4 API
- reactjs - 如何从 MongoDB 中获取数据?
- python - 不和谐音乐机器人列表索引超出范围错误
- javascript - Node js精准计时器