Serverless部署后AWS Lambda提示Handler缺失,请求排查原因
问题背景
使用Serverless Framework管理AWS部署,包含1个Step Function和3个Lambda函数,handler配置为wesii_pipelines.handlers下的对应函数,实现代码位于wesii_pipelines/handlers.py。升级Python运行时从3.7到3.11后,所有Step Functions执行失败,报错:Handler 'file_uploading_handler' missing on module 'wesii_pipelines.handlers'。回滚到Python 3.7重新部署后,错误依然存在,怀疑Serverless Framework构建逻辑变化导致。
可能的原因及排查方案
1. Serverless CLI版本变更导致构建逻辑差异
一年未部署期间,本地Serverless CLI可能已自动升级到新版本,新版本的打包规则、目录结构处理方式可能发生变化,比如:
- 默认开启了
package.individually,导致单个Lambda的打包范围错误 - 调整了默认的包含/排除文件规则,遗漏了
wesii_pipelines目录 - 部署包的根目录结构改变,破坏了模块导入路径
排查/解决:
- 执行
serverless --version查看当前版本,对比一年前使用的版本 - 尝试用旧版本重新部署:
npx serverless@<旧版本号> deploy - 检查
serverless.yml中的package配置,确认没有新增的exclude规则误排除核心代码文件
2. Python环境缓存残留导致打包异常
升级Python版本后,本地虚拟环境、Serverless构建缓存(.serverless目录)可能残留了3.11的文件,回滚到3.7时未彻底清理,导致打包时混入不兼容的文件结构,或模块路径被破坏。
排查/解决:
- 删除本地
.serverless构建目录,清理Python虚拟环境 - 重新创建Python 3.7虚拟环境,安装所有依赖后再执行部署
- 执行
serverless package --package temp-package,解压生成的包文件,确认wesii_pipelines/handlers.py存在且路径正确
3. Lambda部署包路径结构错误
新版本Serverless打包后,部署包内的目录结构可能与旧版本不一致。比如旧版本中wesii_pipelines直接位于部署包根目录,新版本可能将项目根目录作为部署包根,导致模块路径变为project_root.wesii_pipelines.handlers,而非预期的wesii_pipelines.handlers。
排查/解决:
- 在AWS控制台进入对应Lambda函数的代码页面,下载部署包并解压
- 检查解压后的目录结构,确认
wesii_pipelines/handlers.py是否存在,且层级正确 - 若结构错误,在
serverless.yml的package配置中添加include规则,明确指定要包含的目录:package: include: - wesii_pipelines/**
4. Step Functions状态机配置未同步
回滚Python版本时,可能未同步更新Step Functions状态机的配置,导致其调用的是错误的Lambda版本/别名,而该版本的部署包确实缺失handler。
排查/解决:
- 在AWS控制台Step Functions页面,查看状态机的定义,确认每个任务调用的Lambda ARN是否指向当前部署的正确版本
- 若状态机使用了Lambda别名,检查别名是否关联到正确的函数版本
- 重新部署状态机,确保配置与当前Lambda函数同步
5. Handler配置解析逻辑变化
新版本Serverless对handler路径的解析规则可能调整,比如对模块名大小写的处理、相对路径的支持等,导致原本正确的配置无法被正确解析。
排查/解决:
- 检查
serverless.yml中的handler配置,确保格式为wesii_pipelines.handlers.file_uploading_handler,与handlers.py中的函数名完全一致(注意下划线、大小写) - 确认
handlers.py中的函数没有被误删除或重命名 - 尝试在本地测试handler的导入:创建测试脚本,执行
from wesii_pipelines.handlers import file_uploading_handler,验证是否能正常导入
内容的提问来源于stack exchange,提问作者exsurge-domine

