如何为 AWS Lambda Layer 压缩大型 Python 包?

4

我正在尝试部署一个包含大量二进制依赖项(例如numpyscipyastropypandas等)的Python软件包。由于压缩文件超过400MB,所以我必须将其大小缩小到250MB以下,才能从S3部署到lambda层。

我知道可以使用类似以下的命令删除测试、文档和pycache目录:

find -name "tests" -type d | xargs rm -rf
find -name "docs" -type d | xargs rm -rf
find -name "__pycache__" -type d | xargs rm -rf

但这还不够...

理论上可以删除 *.pyc 和 *.so 文件吗?例如,serverless-frameworkserverless-python-requirements 提供了 slim 选项以打包依赖并删除所有 *.pyc 和 *.so 文件。但我认为 Lambda 环境需要这些文件... 如果可能,我不想使用任何框架,并且可以运行 docker 从一个适用于 Lambda 的镜像构建二进制文件(我现在正在使用 WSL)。我尝试了很多东西,但它们都不起作用,我不确定为什么...

我非常感谢任何帮助理解如何将这样一个庞大的包部署到 Lambda 中,以及哪些是可行的和不可行的。


1
不应包括 .pyc 文件,但需要包含 .so 文件。 - jordanm
此外,即使所有这些模块都是静态编译的,400MB听起来也很疯狂。 - jordanm
好的,谢谢。如何不静态编译它们? - bluePhlavio
对于那个疯狂的维度问题,我认为这是由于传递依赖关系。例如,有matplotlib这样的包,虽然我不使用它,但我认为它是其他某些包所必需的... - bluePhlavio
当我在Lambda中遇到限制时,我通常会切换到Fargate任务,它可以完成Lambda大部分的工作。 - jordanm
您还可以使用最多5个层,可以将它们排列成层次结构(每个层次仅依赖于较低的层次)。 - Adrian
1个回答

1
作为解决方案,当我遇到这种情况时,我按照@jordanm的建议切换到Fargate任务。
截至2020年12月,更简单的解决方案是为您的Lambda使用容器镜像

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接