使用Serverless部署AWS Lambda镜像容器时找不到Handler
解决Serverless部署AWS Lambda镜像时的HandlerNotFound问题
问题根源分析
- TypeScript未编译:AWS Lambda Node.js运行环境仅能执行JavaScript文件,你的Dockerfile直接复制了
.ts源码却未做编译,运行时无法识别该格式文件。 - 路径不匹配:Serverless配置的handler路径
src/function/getDocument/index.handler与容器内实际文件位置不符——你把index.ts复制到了容器根目录,但Lambda默认工作目录是/var/task,且未编译的文件无法被运行时加载。 - 关于UserFunction.js:这是AWS Lambda Node.js运行时的核心组件,负责解析你指定的handler路径,加载对应模块并查找导出的
handler函数,当找不到目标文件或文件内无handler导出时,就会抛出HandlerNotFound错误。
修复步骤
1. 调整Dockerfile,添加TS编译流程
Lambda Node.js镜像默认工作目录为/var/task,需将源码复制到该目录,安装依赖并编译TS为JS:
FROM public.ecr.aws/lambda/nodejs:12 # 先复制依赖配置文件,利用Docker缓存优化构建速度 COPY package*.json ./ RUN npm install # 复制所有源码到容器工作目录 COPY src/ ./src/ # 编译TypeScript为JavaScript(需确保项目中有tsconfig.json,且配置了正确的输出目录) RUN npm run build # 设置默认CMD为编译后的handler路径(根据你的tsconfig.outDir调整) CMD ["dist/src/function/getDocument/index.handler"]
2. 同步Serverless配置的handler路径
Serverless的command会覆盖Dockerfile的CMD,需确保路径对应容器内编译后的JS文件位置:
service: example-service provider: name: aws ecr: images: appimage: path: ./ file: Dockerfile platform: linux/arm64 functions: getDocument: image: command: - dist/src/function/getDocument/index.handler entryPoint: - '/lambda-entrypoint.sh' name: appimage
3. 关键检查点
- 确认
index.ts中正确导出了handler函数:export const handler = async (event: any) => { // 业务逻辑代码 return { statusCode: 200, body: "Success" }; }; - 检查
tsconfig.json的outDir配置,确保编译后的JS文件输出到预期目录(比如示例中的dist)。 - 若无需Serverless覆盖默认命令,可删除
serverless.yml中的command配置,直接使用Dockerfile的CMD。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

