AWS Lambda运行报cannot import name 'cygrpc'错误如何解决?
cygrpc导入报错解决方案 Unable to import module 'lambda_function': cannot import name 'cygrpc' from 'grpc._cython' (/var/task/grpc/_cython/init.py)
这个错误的核心是grpcio包包含C语言编译的二进制扩展模块,你本地安装的grpcio的运行架构、Python版本和AWS Lambda实际运行的环境不兼容,导致编译好的cygrpc二进制模块无法在Lambda环境下加载,可通过以下方式解决:
匹配构建环境与Lambda运行环境
优先推荐使用和Lambda完全一致的环境安装依赖,可通过官方Lambda构建容器完成,执行以下命令(将命令中的Python版本替换为你的Lambda运行时对应版本):docker run -v "$PWD":/var/task public.ecr.aws/sam/build-python3.9:latest pip install -r requirements.txt -t .也可以直接在pip安装时指定目标架构和Python版本,无需容器:
- Lambda为x86_64架构时:
pip install grpcio grpcio-status --platform manylinux2014_x86_64 --only-binary=:all: --python-version 39 -t . - Lambda为arm64(Graviton2)架构时:
pip install grpcio grpcio-status --platform manylinux2014_aarch64 --only-binary=:all: --python-version 39 -t .
注意将命令中的--python-version参数值替换为你使用的Python版本,例如Python3.10对应310。
- Lambda为x86_64架构时:
使用纯Python实现的gRPC包
如果你不想处理架构兼容问题,可安装纯Python版本的gRPC实现,安装时添加环境变量强制使用纯Python编译:GRPC_PYTHON_BUILD_EXT_COMPILER_JOBS=2 GRPC_PYTHON_DISABLE_DYNAMIC_STDLIB=1 pip install grpcio --no-binary grpcio -t .该方案的缺点是函数冷启动耗时会高于二进制版本,更适合测试场景使用。
确认版本匹配
检查你本地安装依赖使用的Python大版本,和Lambda控制台配置的运行时Python大版本完全一致,避免跨版本兼容问题。检查打包规则
打包部署包时需将所有依赖文件放在zip包的根目录,不要嵌套在额外的文件夹中。如果你的依赖存放在自定义目录,需要在Lambda控制台配置PYTHONPATH环境变量,添加你的自定义目录路径。
内容的提问来源于stack exchange,提问作者Natarajan

