AWS Lambda层添加Brotli包失败:无法导入_brotli模块
问题描述
我需要在AWS Lambda函数中使用Brotli包,因此尝试将其添加到Lambda层中,操作步骤如下:
- 启动x86架构EC2实例
- 执行命令:
mkdir layer cd layer pip install --target ./package brotli cd ./package zip -r ../package.zip .
- 用
unzip -l package.zip验证package.zip中包含Brotli - 将package.zip上传至S3
- 通过S3对象创建Lambda层
- 运行调用
import brotli的Lambda函数
运行时出现如下错误:
{ "errorMessage": "Unable to import module 'lambda_function': No module named '_brotli'", "errorType": "Runtime.ImportModuleError", "requestId": "9e09618c-4eaa-41a5-8926-0c18f78f87d7", "stackTrace": [] }
已尝试的操作:
- 使用相同步骤添加其他依赖,可正常导入该包
- 本地运行导入Brotli的Lambda处理程序,未出现错误
预期结果:Lambda函数可正常导入Brotli包,无报错
解决方案
这个错误的核心原因是Brotli包含_brotli这个C扩展组件,你当前使用的EC2实例环境与Lambda的运行环境(Amazon Linux 2)不兼容,导致编译生成的扩展文件无法在Lambda中加载。以下是两种可靠的解决方法:
方法1:使用Amazon Linux 2 EC2实例构建层
Lambda的x86运行环境基于Amazon Linux 2,必须在相同环境下安装Brotli才能生成兼容的扩展文件:
- 启动Amazon Linux 2的x86架构EC2实例(不要用其他Linux发行版)
- 先安装Python及依赖工具:
sudo yum install -y python3-pip zip
- 执行安装打包命令:
mkdir layer cd layer pip3 install --target ./package brotli cd ./package zip -r ../package.zip .
- 后续上传S3、创建Lambda层的步骤保持不变
方法2:用Docker模拟Lambda环境构建(无需EC2)
如果不想启动EC2,可以用AWS官方的Lambda运行时镜像来构建:
- 本地安装Docker后,拉取对应Python版本的Lambda镜像(示例为Python 3.9):
docker pull public.ecr.aws/lambda/python:3.9
- 创建临时目录,运行容器并安装Brotli:
mkdir -p ./layer/package docker run -v "$PWD/layer/package:/package" public.ecr.aws/lambda/python:3.9 pip install brotli --target /package
- 进入package目录打包:
cd ./layer/package zip -r ../package.zip .
- 上传S3并创建Lambda层
验证步骤
打包完成后,可通过unzip -l package.zip检查是否存在_brotli.cpython-XXX-x86_64-linux-gnu.so这类文件(XXX对应你的Python版本),存在则说明扩展文件已正确生成。
内容的提问来源于stack exchange,提问作者Robert Luttrell
相关产品推荐
相关产品推荐

