Sam本地模板配置子目录handler报错:无法导入index模块
index模块的问题 看起来你在通过SAM的template.yaml配置Lambda函数,把api子文件夹里的index.js作为handler时遇到了模块导入错误。结合你给出的日志(显示api文件夹被挂载为/var/task),我整理了几个最可能的原因和对应的解决办法:
1. 检查Handler配置是否匹配CodeUri路径
首先确认你的template.yaml里的CodeUri和Handler配置是否对应:
- 如果
CodeUri指向的是api文件夹(比如CodeUri: ./api/),那Handler应该直接写index.handler——因为此时/var/task就是api文件夹的根目录,index.js就在这里。 - 如果
CodeUri指向的是项目根目录(CodeUri: ./),那Handler需要写成api/index.handler,告诉Lambda去api子文件夹找index.js里的handler函数。
举个正确的配置例子(当CodeUri是api文件夹时):
Resources: MyApiFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./api/ Handler: index.handler Runtime: nodejs18.x
2. 确认index.js里的handler函数导出正确
Lambda默认使用CommonJS模块规范,所以你需要确保index.js里的handler是这样导出的:
exports.handler = async (event) => { // 你的handler逻辑 const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
如果你用了ES模块的export default handler,Lambda默认是不识别的(除非你在api文件夹的package.json里加上"type": "module",同时确保Lambda运行时版本支持,比如nodejs14+)。
3. 检查Node.js运行时版本是否兼容
如果你的index.js里用了高版本的Node语法(比如可选链?.、空值合并运算符??等),但template.yaml里配置的Runtime是较低版本(比如已停止支持的nodejs12.x),会导致Lambda无法正确解析文件,看起来像是找不到模块,但实际是语法错误。建议把Runtime升级到当前支持的版本,比如nodejs18.x或nodejs20.x。
4. 排查文件权限问题(本地SAM测试场景)
如果你是在本地用SAM CLI测试,偶尔会遇到文件权限不足的问题。可以尝试给index.js添加可读权限:
chmod +r ./api/index.js
然后重新启动SAM本地服务。
5. 清理SAM本地缓存
有时候SAM本地的缓存会导致奇怪的问题,可以尝试清理缓存后重新部署测试:
sam local invoke --skip-pull-image --no-cache
你可以先从检查Handler配置和函数导出这两点入手,这是最常见的原因。
内容的提问来源于stack exchange,提问作者Saini Basu

