如何在AWS Lambda安装Python依赖包并存储至AWS S3缩短安装耗时
AWS Lambda Python依赖安装耗时过长解决方案
你当前在运行时实时pip安装带C扩展的numpy、pandas等包,需要执行编译流程,是耗时过长的核心原因,可通过以下方案解决:
方案1:预构建Lambda层(最优选择)
完全无需在Lambda运行环境执行安装、打包操作,提前在本地/同架构的Linux环境下预编译好所有依赖,直接打包为官方Lambda层使用:
- 新建名为
python的空文件夹(Lambda层要求依赖必须放在该目录下才能被自动识别) - 执行安装命令(如果是在x86架构环境打包给x86 Lambda使用):
pip install requests==2.25.1 xlrd==2.0.1 pandas==1.2.4 numpy==1.19.5 -t ./python --no-cache-dir - 如果是在M系列Arm架构Mac上打包给x86 Lambda使用,需添加架构指定参数:
pip install requests==2.25.1 xlrd==2.0.1 pandas==1.2.4 numpy==1.19.5 -t ./python --no-cache-dir --platform manylinux2014_x86_64 --only-binary=:all: - 将python目录打包为zip包:
zip -r lambda-py-deps.zip ./python - 在AWS Lambda控制台创建自定义层,上传该zip包后绑定到你的函数即可,无需修改代码的导入逻辑,无额外运行时开销,冷启动速度最快
方案2:预打包依赖存S3,运行时直接拉取解压
如果你不想使用Lambda层,也可以将预打包好的依赖存到S3,Lambda冷启动时直接下载解压使用,打包操作同样在本地完成,不要放到Lambda运行时执行:
- 本地按上述步骤安装好所有依赖后直接打包为zip,上传到你的S3桶,给Lambda执行角色授予该桶的读权限
- Lambda代码替换原安装逻辑为下载解压逻辑即可,参考代码:
import boto3 import zipfile import sys s3_client = boto3.client("s3") # 下载预编译好的依赖包 s3_client.download_file("你的S3桶名", "lambda-py-deps.zip", "/tmp/lambda-py-deps.zip") # 直接解压到/tmp目录 with zipfile.ZipFile("/tmp/lambda-py-deps.zip", "r") as f: f.extractall("/tmp/") # 添加依赖路径 sys.path.insert(1, "/tmp/")
该方案总耗时仅为下载+解压的时间,通常不超过10秒,远低于原实时安装的耗时。
你遇到的Lambda无法写入文件问题说明
Lambda仅开放/tmp目录的写入权限,默认容量为512MB,最大可配置到10GB,如果你尝试在/tmp以外的路径写入压缩包就会触发权限报错。即便你调整写入路径到/tmp可解决该问题,也不推荐在Lambda运行时执行安装、打包操作,会额外消耗计算资源、拉长执行时间。
内容的提问来源于stack exchange,提问作者Thanh Hải Võ
相关产品推荐
相关产品推荐

