部署基于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
相关产品推荐
相关产品推荐

