Lambda层导入Snowflake Python连接器时遭遇GLIBC版本缺失错误
我之前也踩过一模一样的坑!核心原因其实是你构建依赖的EC2环境和Lambda运行环境的GLIBC版本不兼容。
Lambda目前默认用的是Amazon Linux 2运行时,它自带的GLIBC版本是2.26,但如果你的EC2实例是更新的发行版(比如Amazon Linux 2023),系统自带的GLIBC版本会更高(比如2.28+),导致编译出来的cryptography Rust绑定文件_rust.abi3.so依赖了更高版本的GLIBC,Lambda环境满足不了,就会抛出这个错误。
给你几个靠谱的解决思路:
方法一:用与Lambda完全一致的环境构建依赖(最推荐)
Lambda的运行环境是Amazon Linux 2,必须在这个环境里构建依赖,才能保证二进制文件兼容。最方便的方式是用Docker:
# 拉取Amazon Linux 2官方镜像 docker pull amazonlinux:2 # 启动交互式容器 docker run -it amazonlinux:2 /bin/bash # 在容器内安装Python3.9和必要工具 yum install -y python3.9 python3.9-pip zip # 创建Lambda层要求的目录结构(必须是python/开头) mkdir -p /opt/python # 安装指定版本的Snowflake连接器到目标目录 pip3.9 install snowflake-connector-python==3.0.4 -t /opt/python # 进入/opt目录打包 cd /opt zip -r snowflake-connector-layer.zip python/
打包完成后,用docker cp命令把容器里的snowflake-connector-layer.zip复制到本地,再上传作为Lambda层即可。如果不想用Docker,也可以创建一台Amazon Linux 2的EC2实例,按同样步骤构建。
方法二:强制源码编译cryptography
你可以尝试在安装时指定--no-binary cryptography,强制从源码编译cryptography,这样会适配当前环境的GLIBC版本,但这个方法稳定性稍差,因为源码编译需要额外依赖(比如Rust编译器):
pip3.9 install snowflake-connector-python==3.0.4 --no-binary cryptography -t /opt/python
验证依赖兼容性
构建完成后,你可以在构建环境里检查_rust.abi3.so的依赖,确认它没有要求超过2.26的GLIBC版本:
ldd /opt/python/cryptography/hazmat/bindings/_rust.abi3.so
输出里如果GLIBC的版本都是2.26及以下,就说明没问题了。
最后提醒:千万别用Amazon Linux 2023、Ubuntu这类发行版构建Lambda层的Python依赖,它们的系统库版本和Lambda不匹配,很容易出现这类兼容性问题。
备注:内容来源于stack exchange,提问作者Abhi

