![](/img/trans.png)
[英]PostgreSQL not INSERTing in Python on AWS Lambda with psycopg2
[英]AWS Python Lambda "Hello World" + psycopg2 dependency = 3.2 MB. Can I shrink?
我在 index.py 中定义了一个简单的 python lambda index.py
:
def handler(event, context):
return {"msg": "hello world. this is hello handler"}
通过 CDK(打字稿)部署:
const stack = new Stack(app, "PythonHelloStack", {env})
new PythonFunction(stack, `HelloFunction`, {
runtime: Runtime.PYTHON_3_9,
entry: path.join(__dirname, `../../../lambdas/hello`),
})
这有效,大小为 4.8 kB。 伟大的。 如果我向psycopg2-binary
添加单个依赖项,而不更改 Python 代码,AWS Lambda 代码大小会从 4.8 kB 跃升至 3.2 MB。 这是不可避免的还是有解决办法? 我可以做些什么来减少代码大小吗? 我是不是该? 为此创建一个图层是必要的还是有帮助的? 有更简单的解决方法吗? 谢谢:)
我的具有psycopg2-binary
依赖项的项目具有以下pyproject.toml
:
[tool.poetry]
name = "hello"
version = "0.1.0"
description = ""
authors = []
[tool.poetry.dependencies]
python = "~3.9"
psycopg2-binary = "~2.9"
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry-core>=1.1.0"]
build-backend = "poetry.core.masonry.api"
如果您创建一个安装了 PsycoPG2 的 v-env,您会发现由于轮子组件的大小及其依赖关系,这几乎是您可以摆脱的最低限度
虽然它与 2.9 不是 100% 相同,但这是我的 2.9.1:
~/v-3.9/lib/python3.9/site-packages/psycopg2$ du -sh *
8.0K __init__.py
140K __pycache__
4.0K _ipaddress.py
8.0K _json.py
1.5M _psycopg.cpython-39-x86_64-linux-gnu.so
20K _range.py
16K errorcodes.py
4.0K errors.py
8.0K extensions.py
44K extras.py
8.0K pool.py
16K sql.py
8.0K tz.py
注意共享 object 的大小。 您可能还想检查import
语句 - 它们还引入了一些其他部分,这会导致您的代码大小增加。
好的,首先什么是psycopg2-binary
以及binary
的含义:
二进制包自带几个 C 库的自己版本,其中 libpq 和 libssl,无论客户端上是否有其他库都将使用它们
因此psycopg2-binary
包含开箱即用的依赖项。 因为它导致 Lambda 层的大小相对较大。
正如您在上面的链接中看到的,建议使用psycopg2
package 构建自己的库版本:
对于生产用途,建议您使用源代码分发。
这将允许您使用更新的依赖库版本( libpq
、 libssl
等)。 psycopg2-binary
可能是很久以前构建的,可能已经过时或易受攻击。
关于您关于库大小的问题:即使您构建自己的psycopg2
版本,它也会包含与预构建binary
库相同数量的库,所以我不确定这里是否能够经济合理的大小。
您也可以查看此文档,不建议再次使用二进制 package:
二进制 package 是开发和测试的实用选择,但在生产中建议使用从源代码构建的 package。
如果您决定构建库,这个答案也可能会有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.