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

mmz*_*mmz 3 python amazon-s3 amazon-web-services docker aws-lambda

我按照这篇博文来使用 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"
Run Code Online (Sandbox Code Playgroud)

然后将图层存档为 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
Run Code Online (Sandbox Code Playgroud)

s3fs之所以将其包括在内,是因为在尝试使用 pandas: 将 parquet 文件保存到 S3 存储桶时出现以下错误[ERROR] ImportError: Install s3fs to access S3。这个问题是包含s3fs大量增加层大小。如果没有s3fs该层,解压缩后的大小 < 200mb。

我最直接的问题是:如何将层大小减少到 < 250mb,同时仍然使用 Docker 并保留s3fs在我的requirements.txt? 我无法解释 50mb+ 的差异,尤其是PyPis3fs上 < 100kb 。

最后,对于那些质疑我将 Lambda 与 Scrapy 一起使用的人:我的抓取工具微不足道,启动 EC2 实例就有点过分了。

rv.*_*tch 5

我无法解释 50mb+ 的差异,特别是因为 PyPi 上的 s3fs < 100kb。

这很简单就能解释清楚。正如预期的那样,对 AWS 库s3fs具有内部依赖性botocore(在本例中)。好消息是它boto3已经包含在 AWS lambda 中(请参阅此链接了解 lambda 中可用的库),因此您可以botocore从压缩的依赖项中排除并节省高达约 50MB 的总大小

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

  • 博托3
  • 博托科雷
  • 文档
  • jmes路径
  • python-dateutil(生成dateutil包)
  • s3传输
  • 设置工具
  • 六(生成six.py
  • urllib3(如果需要,chardet也可以删除捆绑的依赖项)

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

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

完成所有这些,您应该可以轻松地节省约 60MB 的压缩工件大小。