AWS Lambda Python 3.7运行时无法识别自定义依赖层问题咨询
问题根因
导致模块无法识别的核心原因有3个,按出现概率从高到低排序:
- Lambda Python层目录结构不符合要求:AWS Lambda Python运行时只会将层解压后的
/opt/python目录加入模块搜索路径,你当前的打包方式是直接把依赖放在zip包根目录,解压后依赖会落到/opt/下,运行时自然找不到模块。 - 基础镜像与运行时版本不匹配:你使用的
amazonlinux:latest当前为Amazon Linux 2023,默认Python版本远高于3.7,编译出的二进制依赖和Lambda Python 3.7运行时不兼容。 - 文件权限问题:root身份安装的依赖如果没有设置全局可读权限,Lambda的执行用户没有读取权限也会触发导入错误,不过这是小概率问题。
注:仅用root身份执行pip安装本身不会直接导致该问题,只要依赖文件权限配置正确即可正常使用。
修复方案
- 调整打包目录结构:pip安装依赖时要放到名为
python的子目录下,再对该目录打包,确保zip解压后结构为python/[依赖包文件] - 替换基础镜像为和Lambda Python 3.7运行时完全兼容的
amazonlinux:2,避免系统版本差异导致的兼容问题 - 显式调用Python 3.7对应的pip安装依赖,避免错用其他Python版本的pip导致包版本不匹配
- 打包前统一设置依赖文件权限为所有用户可读,消除权限隐患
修改后的Makefile示例
create-lambda-layer: docker run -dit --name AL amazonlinux:2 docker cp requirements.in AL:/root/requirements.in docker exec -it AL bash -c "yum update -y \ && amazon-linux-extras install python3.7 -y \ && yum install -y zip \ && python3.7 -m pip install --upgrade pip wheel \ && mkdir -p /root/layer/python \ && python3.7 -m pip install -r /root/requirements.in -t /root/layer/python --no-cache-dir \ && cd /root/layer/ \ && chmod -R 755 python/ \ && zip -r python.zip python/" docker cp AL:/root/layer/python.zip . docker stop AL docker rm -f AL
验证方法
生成zip包后执行unzip -l python.zip查看结构,正确的输出应该类似:
python/ python/gitlab/ python/holidays/ python/...其他依赖文件
如果部署后仍有问题,可以在Lambda代码中加入以下代码打印模块搜索路径排查:
import sys print(sys.path)
正常输出中必然包含/opt/python路径。
内容的提问来源于stack exchange,提问作者Carmella
相关产品推荐
相关产品推荐

