AWS Lambda部署Python代码报No module named '_cffi_backend'错误
你遇到的ModuleNotFoundError: No module named '_cffi_backend'报错核心原因是带C扩展的Python依赖包的编译环境和Lambda运行环境不兼容。cffi、cryptography这类包含二进制扩展的包,在不同Python版本、不同CPU架构下编译出来的二进制文件无法通用,你在Python3.7的EC2环境下打包的依赖,不管是给Lambda Python3.9用还是给Python3.7用,都会因为环境差异出现二进制兼容问题。
解决步骤
1. 匹配打包环境与Lambda运行环境
- 确认你要使用的Lambda运行时版本(推荐使用Python3.9及以上受支持版本),打包依赖时必须使用完全相同的Python主版本+次版本。
- 确认Lambda运行的CPU架构:如果Lambda用的是x86_64架构,就用x86架构的Amazon Linux 2环境打包;如果用的是arm64/Graviton架构,就用对应arm架构的环境打包,两者的二进制完全不兼容。
2. 推荐使用官方Lambda镜像打包(成功率最高)
直接用AWS官方预构建的Lambda运行时镜像安装依赖,完全匹配线上环境:
- 新建一个空文件夹,把你的Lambda代码和
requirements.txt放进去,requirements.txt内容参考:
aws-encryption-sdk>=3.1.0 cryptography>=38.0.0 cffi>=1.15.0 boto3
- 拉取对应运行时的官方镜像,比如Python3.9 x86版本:
docker pull public.ecr.aws/lambda/python:3.9
如果是arm64版本就拉取public.ecr.aws/lambda/python:3.9-arm64
3. 在当前目录执行容器命令安装依赖到当前目录:
docker run -v "$PWD":/var/task public.ecr.aws/lambda/python:3.9 pip install -r requirements.txt -t .
- 把当前目录所有内容打包成zip包,注意要直接打包文件,不要外层套文件夹。
3. 额外代码修复提示
你提供的代码存在一处缩进错误,会导致只能返回最后一条数据库活动事件:
原代码中retObj.append(dbEvent)在for循环外,需要调整缩进放到for循环内部:
try: events = json.loads(plaintextEvents) for dbEvent in events['databaseActivityEventList']: print(dbEvent) retObj.append(dbEvent) # 调整缩进,放到for循环内部 except Exception as e: print (e) raise e
内容的提问来源于stack exchange,提问作者brantha
相关产品推荐
相关产品推荐

