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

问题描述 投票:0回答:2

我正在关注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 实例就太过分了。

python amazon-web-services docker amazon-s3 aws-lambda
2个回答
7
投票

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

这很简单,很容易解释。正如预期的那样,

s3fs
对 AWS 库具有内部依赖项(在本例中为
botocore
)。好消息是
boto3
已包含在 AWS lambda 中(请参阅此链接了解 lambda 中可用的库),因此您可以从压缩依赖项中排除
botocore
并节省 总大小高达约 50MB .

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

  • awslambdaric(运行时:python 3.9+)
  • 波托3
  • botocore
  • docutils(运行时:python 3.8)
  • jmespath
  • python-dateutil(生成
    dateutil
    包)
  • s3传输
  • setuptools(运行时:python 3.8、3.9、3.10)
  • simplejson(运行时:python 3.9+)
  • 六(生成
    six.py
  • urllib3(如果需要,也可以删除像
    chardet
    这样的捆绑依赖项)

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

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

完成所有这些操作,您应该可以轻松保存 大约 60MB 的压缩工件大小。


3
投票

缩小图层背后的关键思想是确定安装的内容以及可以删除的内容(通常是手动进行)。

就你而言,由于你只略高于限制,我会摆脱

pip

。因此,在创建 zip 图层之前,您可以在图层的文件夹中运行以下命令(来自您过去的问题的

pandas/tests
):
mylayer

解压后,这应该会将您的图层修剪到 262MB 限制以下。在我的测试中,现在是
244MB

或者,您可以手动浏览

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

文件夹,然后开始删除不需要的任何其他测试、文档、示例等。

    

© www.soinside.com 2019 - 2024. All rights reserved.