AWS Lambda配置Lambda层后仍找不到Chromedriver依赖的libglib-2.0.so.0
Lambda运行Java Selenium场景下Chromedriver缺共享原生库的修复方案
问题根因
你之前反复调整层路径、配LD_LIBRARY_PATH都没解决,通常是两个常见问题:
- 层打包目录错了:Lambda层的文件会直接解压到函数运行环境的
/opt目录,如果你打zip的时候在包里面手动建了/opt或者/opt/lib文件夹,实际运行时的库路径就变成/opt/opt/lib/xxx.so,动态链接器根本找不到 - 只补单个缺失的so:Chromedriver和无界面Chrome的依赖是成链的,你只手动抠一个
libglib-2.0.so.0放进去,修完第一个报错马上会冒出来下一个缺的库,根本不是单个文件的问题
正确操作流程
- 制作依赖包的时候,一定要用和Lambda运行时同版本的Amazon Linux容器,别在自己本地的普通Linux环境编译so,glibc版本对不上,就算路径对了也加载失败
- 在容器里一次性把Chromedriver需要的所有原生依赖装全,执行安装命令:
yum install -y glib2 nss atk at-spi2-atk libdrm libXcomposite libXdamage libXtst cups-libs libXScrnSaver pango libX11 libxcb mesa-libgbm alsa-lib - 从容器的
/usr/lib64路径把上面这些包带的所有.so动态库都收集出来,打zip的时候千万别在包里面嵌套/opt层级——直接把收集的so放在zip里的lib/文件夹下,打开zip第一眼就能看到lib目录就算对 - 环境变量别配错:
LD_LIBRARY_PATH的值不要只写/opt/lib,要写全成/opt/lib:/usr/lib64,把系统自带的库搜索路径带上,不然容易丢基础库 - 一定要在启动Chromedriver之前,把
LD_LIBRARY_PATH导出到运行时环境,别等chromedriver已经加载失败了才想起来设变量
快速排查技巧
- 函数刚启动的时候先跑一下
ldd /tmp/chromedriver,把输出打到日志里,逐行看哪些库后面标了not found,别盯着第一个缺的libglib修完就跑 - 调试的时候先把实际运行时的
LD_LIBRARY_PATH值打日志出来,确认之前在控制台配的环境变量没被Java运行时覆盖
避坑提醒
- 别拿层里收集的so去覆盖Lambda运行环境自带的系统基础库,很容易出其他莫名其妙的崩溃
- 嫌麻烦不想从零打包的话,可以对齐自己用的Java运行时版本,直接用社区维护好的、带全量Chromedriver和依赖的公共Lambda层,省得自己反复打包装依赖
内容的提问来源于stack exchange,提问作者tmath
相关产品推荐
相关产品推荐

