繁体   English   中英

AWS Python Lambda“Hello World”+ psycopg2 依赖项 = 3.2 MB。 我可以缩小吗?

[英]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 构建自己的库版本:

对于生产用途,建议您使用源代码分发。

这将允许您使用更新的依赖库版本( libpqlibssl等)。 psycopg2-binary可能是很久以前构建的,可能已经过时或易受攻击。

关于您关于库大小的问题:即使您构建自己的psycopg2版本,它也会包含与预构建binary库相同数量的库,所以我不确定这里是否能够经济合理的大小。

您也可以查看此文档,不建议再次使用二进制 package:

二进制 package 是开发和测试的实用选择,但在生产中建议使用从源代码构建的 package。

如果您决定构建库,这个答案也可能会有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM