减少与AWS Lambda一起使用的Python压缩文件大小



我遵循这篇博文,使用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尺寸上,它是>Failed to create layer version: Unzipped size must be smaller than 262144000 bytes.

这是我的requirements.txt:

s3fs
scrapy
pandas
requests

我包括s3fs,因为我得到以下错误时,试图保存一个拼花文件到S3桶使用熊猫:[ERROR] ImportError: Install s3fs to access S3。这个问题是,包括s3fs大大增加了层的大小。如果没有s3fs,图层为<200 mb解压。

我最直接的问题是:我如何将图层大小减小到<250mb,而仍然使用Docker和保持s3fs在我的requirements.txt?我无法解释50mb+的差异,特别是自从s3fs<100kb on PyPi.

最后,对于那些质疑我在Scrapy中使用Lambda的人:我的scraper是微不足道的,并且旋转一个EC2实例将是多余的。

我无法解释50mb+的差异,特别是自从s3fs <100kb on PyPi.

这很容易解释。正如预期的那样,s3fs对AWS库(本例中是botocore)具有内部依赖关系。好消息是boto3已经包含在AWS lambda中(请参阅lambda中可用库的链接),因此您可以从压缩依赖项中排除botocore,并将保存到总大小约50MB.

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

  • boto3
  • botocore
  • docutils
  • jmespath
  • pip
  • python-dateutil(生成dateutil包)
  • s3transfer
  • setuptools
  • 六(生成six.py)
  • urllib3(如果需要,像chardet这样的捆绑依赖也可以被删除)

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

  • __pycache__
  • *.dist-info(示例:certificate -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文件夹,并开始删除任何其他不需要的测试,文档,示例等。

相关内容

  • 没有找到相关文章

最新更新