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

部署基于Docker镜像的NestJS Monorepo AWS Lambda时遇模块找不到错误

问题排查:NestJS Monorepo部署AWS Lambda Docker镜像报错找不到模块'main'

项目结构

- root
-- apps
--- lambda-one
---- src
----- main.ts //  <- lambda handler
-- node_modules
-- package.json
-- template.yaml
-- Dockerfile

AWS SAM 配置

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'

Resources:
  LambdaOne:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: .
      DockerTag: v1
      DockerBuildArgs:
        NODE_ENV: dev

Dockerfile 配置

FROM public.ecr.aws/lambda/nodejs:16 as builder

WORKDIR /usr/src/app

COPY /apps/lambda-one ./apps/lambda-one
COPY package.json ./
COPY tsconfig.json ./
COPY tsconfig.build.json ./
COPY nest-cli.json ./
COPY yarn.lock ./

RUN npm install --global yarn

RUN yarn install
RUN yarn build lambda-one

FROM public.ecr.aws/lambda/nodejs:16

WORKDIR /usr/src/app

COPY --from=builder /usr/src/app/dist ./dist
COPY --from=builder /usr/src/app/node_modules ./node_modules

CMD ["dist/apps/lambda-one/main.handler"]

报错信息

ERROR   Uncaught Exception  {"errorType":"Runtime.ImportModuleError","errorMessage":"Error: Cannot find module 'main'\nRequire stack:\n- /var/runtime/index.mjs","stack":["Runtime.ImportModuleError: Error: Cannot find module 'main'","Require stack:","- /var/runtime/index.mjs","    at _loadUserApp (file:///var/runtime/index.mjs:1087:17)","    at async Object.UserFunction.js.module.exports.load (file:///var/runtime/index.mjs:1119:21)","    at async start (file:///var/runtime/index.mjs:1282:23)","    at async file:///var/runtime/index.mjs:1288:1"]}
INIT_REPORT Init Duration: 562.92 ms

排查步骤

  • 确认构建产物路径与文件存在性
    本地执行yarn build lambda-one后,检查dist/apps/lambda-one目录下是否生成了main.js文件(NestJS编译TypeScript后会输出js文件,Lambda运行时依赖js而非ts)。同时确认该文件中正确导出了handler函数。

  • 修正Dockerfile的CMD指令
    AWS Lambda Node.js运行时的CMD格式可尝试拆分路径与函数名写法,避免路径解析错误:

    CMD ["dist/apps/lambda-one/main", "handler"]
    
  • 验证镜像内的文件结构
    构建本地镜像后,运行容器进入内部检查文件路径:

    docker build -t lambda-test .
    docker run -it lambda-test /bin/bash
    

    进入容器后查看/usr/src/app/dist/apps/lambda-one下是否存在main.js,以及文件内容是否包含预期的handler导出。

  • 检查NestJS构建配置
    查看nest-cli.json中的compilerOptions,确认outDir设置为dist,且deleteOutDir未误删构建产物;同时检查tsconfig.json和tsconfig.build.json,确保rootDir覆盖了apps/lambda-one/src目录,保证编译路径正确。

  • 确认SAM构建流程无异常
    检查SAM构建时是否使用了正确的Docker上下文(当前配置为.,即项目根目录),确保所有依赖文件被正确复制到镜像中;同时查看构建日志,确认yarn install和yarn build lambda-one步骤无报错。

内容的提问来源于stack exchange,提问作者Billy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:46:29