减少与AWS Lambda一起使用的Python zip大小

2024-06-25 07:12:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面的this博客文章中使用Docker创建一个运行时环境,用于AWS Lambda。我正在创建一个用于Python 3.8的层:

docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"

然后将该层归档为zip:zip -9 -r mylayer.zip python

到目前为止都是标准的。问题出现在.zip大小中,即>;250mb,因此在Lambda中创建以下错误:Failed to create layer version: Unzipped size must be smaller than 262144000 bytes

这是我的requirements.txt

s3fs
scrapy
pandas
requests

我之所以包括s3fs,是因为我在尝试使用pandas将拼花地板文件保存到S3 bucket时遇到以下错误:[ERROR] ImportError: Install s3fs to access S3。这个问题是包含s3fs会大大增加层的大小。没有s3fs层是<;200mb解压

我最直接的问题是:如何将层大小减小到<;250mb,但仍然使用Docker并将s3fs保留在我的requirements.txt中,我无法解释50mb+的差异,特别是因为s3fs<;在PyPi上显示100kb

最后,对于那些质疑我在Scrapy中使用Lambda的人来说:我的刮板很简单,旋转一个EC2实例就太过了


Tags: tolambdadockerlttxtawspandass3
2条回答

I can't explain the 50mb+ difference, especially since s3fs < 100kb on PyPi.

这很简单,可以解释。正如所料,s3fs在AWS库上有internal dependencies(在本例中为botocore)。好消息是boto3已经包含在AWS lambda中(请参见lambda中提供的this link库),因此您可以从压缩依赖项中排除botocore,并将的总大小保存到~50MB

有关更多信息,请参阅上面的链接。您可以安全地从压缩的工件文件中删除这些库,并且仍然能够在运行Python 3.8的AWS lambda函数上运行代码:

  • 博托
  • 博托考
  • 文件
  • jmespath
  • 皮普
  • python dateutil(生成dateutil包)
  • S3传输
  • 设置工具
  • 六(生成six.py
  • urllib3(如果需要,也可以删除像chardet这样的捆绑依赖项)

您还可以使用bash脚本递归地删除以下不需要的(垃圾)目录:

  • __pycache__
  • *.dist-info(例如:certifi-2021.5.30.dist-info
  • tests-只有可能,但我无法确认。如果您确实选择递归地删除所有tests文件夹,请首先检查lambda上是否有任何中断,因为在极少数情况下,这样的包可以在代码中导入

执行所有这些操作后,您应该可以轻松地将压缩工件大小节省约60MB。

缩小图层背后的关键思想是确定pip安装了什么以及可以删除什么,通常是手动删除

在你的情况下,因为你只是稍微高于限制,我会摆脱pandas/tests。因此,在创建zip层之前,您可以在该层的文件夹中运行以下内容(mylayer,来自您过去的问题):

rm -rvf python/lib/python3.8/site-packages/pandas/tests

这将在解包后将层修剪到262MB限制以下。在我的测试中,它现在是244MB

或者,您可以手动浏览python文件夹,并开始删除任何其他不需要的测试、文档、示例等

相关问题 更多 >