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 实例就有点过分了。
我无法解释 50mb+ 的差异,特别是因为 PyPi 上的 s3fs < 100kb。
这很简单就能解释清楚。正如预期的那样,对 AWS 库s3fs具有内部依赖性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 的压缩工件大小。
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |