我遵循这篇博文,使用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
文件夹,并开始删除任何其他不需要的测试,文档,示例等。