AWS Lambda导入python-ldap时出现libldap_r-2.4.so.2缺失报错如何解决
解决方法
问题根因
AWS Lambda的Amazon Linux 2运行时默认不携带openldap相关的系统动态链接库,你在EC2本地测试时可以调用系统路径下的libldap_r-2.4.so.2等文件,但打包Layer时没有将这些依赖的系统库一起打包,因此Lambda运行时找不到对应文件报错。
具体操作步骤
- 第一步:定位python-ldap依赖的所有动态库
在用来构建Layer的Amazon Linux 2 EC2实例上执行以下命令,找到python-ldap的核心so文件:find / -name "_ldap.cpython-*.so" 2>/dev/null
拿到输出的文件路径后,用ldd命令查看所有依赖项:ldd 【替换为上一步输出的_ldap.cpython-*.so文件路径】
你会在输出列表中看到包括libldap_r-2.4.so.2、liblber-2.4.so.2在内的所有依赖动态库。 - 第二步:重构Layer目录结构
AWS Lambda会自动加载Layer中lib目录下的动态库,因此构建Layer时需要按规范创建目录:
# 新建Layer所需的两个核心目录 mkdir -p python lib # 安装python-ldap到python目录(如果你之前已经安装过,直接把已有的python包内容放到该目录即可) pip install python-ldap --target ./python # 把所有依赖的.so文件从系统路径复制到lib目录 cp /usr/lib64/libldap_r-2.4.so.2 ./lib/ cp /usr/lib64/liblber-2.4.so.2 ./lib/ # 把ldd命令输出中其他不在Lambda默认环境中的.so文件也一并复制到lib目录
- 第三步:重新打包上传Layer
在python和lib目录的同级路径下执行打包命令,确保目录结构正确:zip -r python-ldap-layer.zip python/ lib/
将新的zip包上传为Lambda Layer新版本,重新绑定到函数后测试即可。
注意事项
- 构建Layer的EC2架构需要和Lambda运行时架构保持一致,x86_64运行时用x86_64架构EC2构建,arm64运行时用Graviton架构EC2构建,避免架构不兼容报错。
- 如果后续还出现其他
.so文件找不到的报错,重复ldd查找步骤,将缺失的文件补充到Layer的lib目录即可。
内容的提问来源于stack exchange,提问作者5kobrat
相关产品推荐
相关产品推荐

