如何在AWS Lambda中安装Pydantic库?解决模块缺失报错
我基于Serverless Framework、Flask和MongoDB开发项目,在安装Pydantic库时出现报错:ModuleNotFoundError: No module named 'pydantic_core._pydantic_core',尽管requirements.txt中已经明确指定了该库。请问是否有办法在AWS Lambda中成功安装Pydantic,或是该库本身无法在Lambda环境中使用?
Cloudwatch日志追踪
File "/var/task/app.py", line 5, in <module> from pydantic import ValidationError File "/var/task/pydantic/__init__.py", line 3, in <module> import pydantic_core File "/var/task/pydantic_core/__init__.py", line 6, in <module> from ._pydantic_core import ( ModuleNotFoundError: No module named 'pydantic_core._pydantic_core' [ERROR] Exception: Unable to import app.app Traceback (most recent call last): File "/var/lang/lib/python3.11/importlib/__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1204, in _gcd_import File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 940, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "/var/task/wsgi_handler.py", line 115, in <module> wsgi_app = import_app(config) File "/var/task/wsgi_handler.py", line 48, in import_app raise Exception("Unable to import {}".format(config["app"]))
requirements.txt
Flask==1.1.4 Werkzeug==1.0.1 markupsafe==2.0.1 pymongo==4.5.0 pydantic==2.2.1 pydantic_core==2.6.1 email-validator==2.0.0.post2
serverless.yml
service: users frameworkVersion: "3" custom: wsgi: app: app.app provider: name: aws runtime: python3.11 stage: dev region: us-west-2 environment: MONGO_URI: <mongo_uri> functions: api: handler: wsgi_handler.handler events: - httpApi: "*" plugins: - serverless-wsgi - serverless-python-requirements
这个问题的核心是Pydantic 2.x版本依赖的pydantic_core包含二进制扩展文件,若在非Linux环境(如Windows、macOS)本地安装依赖,生成的二进制文件无法兼容AWS Lambda的Amazon Linux运行环境,导致部署后找不到核心模块。以下是几种可行的解决方法:
配置
serverless-python-requirements在Docker中构建依赖
在serverless.yml的custom字段中添加pythonRequirements配置,让插件通过Docker模拟Lambda的Linux环境安装依赖,确保生成的二进制文件完全兼容:custom: wsgi: app: app.app pythonRequirements: dockerizePip: true配置后,插件会自动拉取对应Lambda runtime的镜像,在容器内完成依赖安装,打包后的产物可直接在Lambda上正常运行。
降级至Pydantic 1.x版本
Pydantic 1.x基于纯Python实现,不依赖pydantic_core这类二进制核心库,兼容性更强。修改requirements.txt,替换Pydantic版本并移除pydantic_core依赖:pydantic==1.10.12重新执行部署即可解决模块缺失问题。
在Linux环境手动构建依赖包
若本地环境为Linux,可直接执行以下命令将依赖安装到指定目录,再与代码一起打包部署:pip install -r requirements.txt -t ./vendor也可使用AWS EC2的Amazon Linux实例构建依赖,确保环境与Lambda完全一致。
更新
serverless-python-requirements插件版本
旧版本的serverless-python-requirements插件对Pydantic 2.x的支持可能存在缺陷,执行以下命令更新至最新版本:npm update serverless-python-requirements
内容的提问来源于stack exchange,提问作者Leo Ameb

