AWS SAM构建失败:本地Python版本与Lambda Runtime版本不匹配
SAM 本地构建默认会优先查找与模板中Runtime字段版本完全匹配的本地系统 Python 解释器完成依赖安装,和本地模拟运行的逻辑相互独立。你本地仅安装了Python 3.9,模板配置的运行时为python3.7,构建环节校验不到对应版本的解释器就会抛出MisMatchRuntimeError。之前本地模拟可以正常运行,是因为调用了你提前拉取的Python3.9仿真容器,和构建流程的校验规则无关。
按推荐优先级从高到低排列:
方案1:使用容器模式构建(无需安装多版本Python,兼容性最好)
SAM原生支持在与Lambda线上运行时完全一致的容器中完成构建,不需要本地安装对应版本的Python,执行构建时追加--use-container参数即可:
sam build --use-container --profile covid
执行命令后SAM会自动拉取官方Python3.7版本的构建镜像,在容器内完成依赖打包、代码编译全流程,构建产物和线上Lambda环境的兼容性最高,是跨版本构建最省心的方案,不需要额外调整本地环境配置。
方案2:本地安装Python3.7并配置到系统PATH
如果不想每次构建都依赖容器拉取,可以在本地安装Python3.7,保证python3.7可执行文件在系统PATH中可被检索到:
- Debian/Ubuntu系Linux:直接执行apt源安装
sudo apt update && sudo apt install python3.7 python3.7-venv - macOS:通过homebrew安装后手动链接到PATH
brew install python@3.7 brew link python@3.7 --force - Windows:下载Python3.7安装包,安装时勾选「Add Python to PATH」选项即可
安装完成后执行which python3.7(Linux/macOS)或where python3.7(Windows),如果能返回对应可执行文件路径,重新执行原build命令即可正常构建。
方案3:统一Runtime版本(无版本强依赖时推荐)
Python3.7已经结束官方生命周期,Lambda也已停止对该版本的主流支持,如果你的业务代码没有强依赖Python3.7的专属特性,可以直接修改template.yml中的Runtime配置,和本地Python3.9版本对齐:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: Runtime: python3.9 # 其余配置保持不变
修改后直接执行原build命令即可,同时本地模拟使用的3.9容器也会和配置完全匹配,不会出现本地测试与线上运行版本不一致的问题。
注意:如果选择升级Runtime版本,建议提前在本地跑一遍全量功能测试,确认没有语法、依赖兼容问题再上线。
内容的提问来源于stack exchange,提问作者Santhosh

