You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Serverless部署AWS Lambda镜像容器时找不到Handler

解决Serverless部署AWS Lambda镜像时的HandlerNotFound问题

问题根源分析

  1. TypeScript未编译:AWS Lambda Node.js运行环境仅能执行JavaScript文件,你的Dockerfile直接复制了.ts源码却未做编译,运行时无法识别该格式文件。
  2. 路径不匹配:Serverless配置的handler路径src/function/getDocument/index.handler与容器内实际文件位置不符——你把index.ts复制到了容器根目录,但Lambda默认工作目录是/var/task,且未编译的文件无法被运行时加载。
  3. 关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:01:18