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

AWS Lambda TypeScript Runtime.ImportModuleError问题求助(CDK部署)

解决AWS CDK部署Lambda时的Runtime.ImportModuleError问题

问题根源

  1. CDK打包范围错误:你的CDK代码中lambda.Code.fromAsset("src/lambda/handlers")仅打包了handlers目录,functions目录不在打包范围内,导致Lambda运行环境中不存在../functions/createUser模块。
  2. Handler代码变量名错误:createUserHandler.ts中调用了createPayment.default,但导入的模块是createUser,变量名不匹配。

解决方案

方案一:调整CDK打包范围并修正代码

  1. 修改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,
        });
    
  2. 修正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);
    }
    
  3. 确保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代码,将所有依赖合并为一个文件,彻底避免路径问题:

  1. 导入NodejsFunction:

    import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
    
  2. 创建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会自动处理所有依赖导入。

验证步骤

  1. 重新部署CDK栈:cdk deploy
  2. 测试Lambda函数,确认不再出现模块找不到的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:45:57