AWS Lambda函数无法识别regex库的问题求助(已尝试多种方案)
解决AWS Lambda Python 3.10中regex库导入错误(找不到regex._regex)
问题描述
开发AWS Lambda函数时使用regex库解析输入,代码片段如下:
import regex def lambda_handler(event, context): ... pattern = r'\{(\w+)\}' text_variables = regex.findall(pattern, mail_body) for t_var in text_variables: if t_var not in variables: error_list.append(f"An unregistered variable name was used in the mail body, specifically {t_var}.")
测试时出现导入错误(处理程序文件为app.py):
{ "errorMessage": "Unable to import module 'app': No module named 'regex._regex'", "errorType": "Runtime.ImportModuleError", "requestId": "XXXXX", "stackTrace": [] }
已确认处理程序设置为app.lambda_handler,尝试过创建Layer、直接打包部署包两种方案,均未解决问题,当前使用Python 3.10运行时。添加Layer后错误从“找不到regex模块”变为“找不到regex._regex”,已知_regex是regex的依赖模块。
解决方案
1. 构建兼容Lambda环境的regex包
regex库包含C扩展模块_regex,该模块是编译后的二进制文件,与操作系统、Python版本强相关。Lambda的Python 3.10运行时基于Amazon Linux 2,本地(Windows/macOS)安装的包无法兼容,必须在匹配环境中构建:
方法一:使用Docker模拟Lambda环境
运行以下命令,在Docker容器中安装兼容的regex包:
docker run -v "$PWD":/var/task public.ecr.aws/sam/build-python3.10:latest /bin/bash -c "pip install regex -t python/lib/python3.10/site-packages/"
执行完成后,当前目录会生成python文件夹,将其压缩为zip包(压缩时直接包含python目录,而非目录内的文件),上传作为Lambda Layer。
方法二:在Amazon Linux 2 EC2实例上构建
- 启动一台Amazon Linux 2的EC2实例,安装Python 3.10:
sudo amazon-linux-extras install python3.10 - 创建目录并安装regex:
mkdir -p python/lib/python3.10/site-packages pip3.10 install regex -t python/lib/python3.10/site-packages/ - 打包并下载:
将生成的zip -r regex-layer.zip python/regex-layer.zip下载后作为Lambda Layer上传。
2. 正确构建部署包(直接打包方式)
若选择将regex直接打包进部署包,同样需在兼容环境中操作:
# 进入你的Lambda项目目录 cd your-lambda-project # 创建lib目录存放依赖 mkdir -p lib # 安装regex到lib目录 pip3.10 install regex -t lib/ # 打包app.py和lib目录(注意不要包含外层项目目录) zip -r lambda-deploy.zip app.py lib/
将生成的lambda-deploy.zip上传至Lambda即可。
3. 排查Layer配置问题
- 确保Layer的运行时选择Python 3.10
- 检查Layer压缩包结构:解压后必须能看到
python/lib/python3.10/site-packages/regex目录和_regex.so文件 - 避免同时使用Layer和部署包中的regex,防止依赖冲突,只保留一种方式即可
原因说明
regex._regex是regex库的C扩展模块,负责核心正则匹配逻辑,必须在与Lambda运行时一致的操作系统(Amazon Linux 2)和Python版本(3.10)环境下编译生成。本地环境编译的模块无法在Lambda环境中加载,因此会出现找不到模块的错误。
内容的提问来源于stack exchange,提问作者Spiridon
相关产品推荐
相关产品推荐

