我正在关注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 将 parquet 文件保存到 S3 存储桶时出现以下错误:[ERROR] ImportError: Install s3fs to access S3
。这个问题是,包含 s3fs
会大量增加层大小。如果没有 s3fs
,该层就是 < 200mb unzipped.
我最直接的问题是:如何将我的< 250mb while still using Docker and keeping
s3fs
中的图层大小减小到requirements.txt
?我无法解释50mb+的差异,特别是因为s3fs
< 100kb on PyPi。
最后,对于那些质疑我在 Scrapy 中使用 Lambda 的人:我的抓取工具微不足道,启动 EC2 实例就太过分了。
我无法解释 50mb+ 的差异,特别是自从 s3fs < 100kb on PyPi.
这很简单,很容易解释。正如预期的那样,
s3fs
对 AWS 库具有内部依赖项(在本例中为 botocore
)。好消息是 boto3
已包含在 AWS lambda 中(请参阅此链接了解 lambda 中可用的库),因此您可以从压缩依赖项中排除 botocore
并节省 总大小高达约 50MB .
请参阅上面的链接了解更多信息。您可以安全地从压缩工件文件中删除这些库,并且仍然能够在运行 Python 3.8 的 AWS lambda 函数上运行代码:
dateutil
包)six.py
)chardet
这样的捆绑依赖项)您还可以使用 bash 脚本递归地删除您不需要的以下(垃圾)目录:
__pycache__
*.dist-info
(示例:certifi-2021.5.30.dist-info)tests
- 仅可能,但我无法确认。如果您确实选择递归删除所有 tests
文件夹,请首先检查 lambda 是否有任何问题,因为在极少数情况下,可以在代码中导入此类包。完成所有这些操作,您应该可以轻松保存 大约 60MB 的压缩工件大小。
缩小图层背后的关键思想是确定安装的内容以及可以删除的内容(通常是手动进行)。
就你而言,由于你只略高于限制,我会摆脱pip
。因此,在创建 zip 图层之前,您可以在图层的文件夹中运行以下命令(来自您过去的问题的
pandas/tests
):mylayer
解压后,这应该会将您的图层修剪到 262MB 限制以下。在我的测试中,现在是244MB
。 或者,您可以手动浏览
rm -rvf python/lib/python3.8/site-packages/pandas/tests
文件夹,然后开始删除不需要的任何其他测试、文档、示例等。