AWS Lambda TypeScript Runtime.ImportModuleError问题求助(CDK部署)
解决AWS CDK部署Lambda时的Runtime.ImportModuleError问题
问题根源
- CDK打包范围错误:你的CDK代码中
lambda.Code.fromAsset("src/lambda/handlers")仅打包了handlers目录,functions目录不在打包范围内,导致Lambda运行环境中不存在../functions/createUser模块。 - Handler代码变量名错误:
createUserHandler.ts中调用了createPayment.default,但导入的模块是createUser,变量名不匹配。
解决方案
方案一:调整CDK打包范围并修正代码
修改CDK的Lambda配置:
将code路径改为整个lambda目录,同时更新handler路径(打包整个lambda目录后,入口文件位于handlers子目录下):const createUserLambda = new lambda.Function(this, 'CreateUser', { runtime: lambda.Runtime.NODEJS_12_X, handler: 'handlers.createUserHandler.handler', // 路径格式:子目录.文件名.导出函数名 code: lambda.Code.fromAsset("src/lambda"), // 打包整个lambda目录 timeout: cdk.Duration.minutes(5), functionName: `createUser-${stage}`, memorySize: 1024, role: lambdaExecutionRole, });修正Handler代码的变量错误:
将createPayment.default改为createUser.default,同时补充Event类型定义(符合TypeScript语法要求):import createUser = require("../functions/createUser"); // 定义Event类型,可根据实际业务调整类型细节 type Event = { arguments: { user: Record<string, any>; }; }; export async function handler(event: Event) { return await createUser.default(event.arguments.user); }确保TypeScript编译结构正确:
在tsconfig.json中配置rootDir和outDir,保证编译后的文件结构与源码一致:{ "compilerOptions": { "outDir": "dist", "rootDir": "src", "target": "ES2018", // 匹配Node.js 12.x的支持版本 "module": "CommonJS" }, "include": ["src/**/*"] }此时CDK的
code路径需改为编译后的目录:lambda.Code.fromAsset("dist/lambda")
方案二:使用CDK的NodejsFunction自动打包(推荐)
使用aws-cdk-lib/aws-lambda-nodejs中的NodejsFunction构造函数,它会自动用esbuild打包TypeScript代码,将所有依赖合并为一个文件,彻底避免路径问题:
导入NodejsFunction:
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';创建Lambda函数:
const createUserLambda = new NodejsFunction(this, 'CreateUser', { runtime: lambda.Runtime.NODEJS_12_X, entry: 'src/lambda/handlers/createUserHandler.ts', // 指定TypeScript入口文件 handler: 'handler', // 导出的函数名 timeout: cdk.Duration.minutes(5), functionName: `createUser-${stage}`, memorySize: 1024, role: lambdaExecutionRole, });该方式无需手动处理TypeScript编译和目录打包,esbuild会自动处理所有依赖导入。
验证步骤
- 重新部署CDK栈:
cdk deploy - 测试Lambda函数,确认不再出现模块找不到的错误。
内容的提问来源于stack exchange,提问作者user2845399
相关产品推荐
相关产品推荐

