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

使用AWS CDK构建AppSync+Lambda+DynamoDB遇Runtime.importModuleError

问题分析与解决方案

核心错误原因

出现Runtime.importModuleError且Lambda层数为0,主要源于两个关键问题:

  1. 依赖缺失:你使用的AWS SDK v3(@aws-sdk/client-dynamodb、@aws-sdk/lib-dynamodb)属于第三方依赖,Lambda默认运行时不包含这些包,且当前代码部署包未打包依赖。
  2. 字段名不匹配:CDK中配置的AppSync Mutation字段是addTodo,但Lambda入口代码中对应的switch case写的是createTodo,后续会导致调用失败(虽不是当前导入错误,但需同步修复)。

分步解决方案

1. 打包Lambda依赖包

进入你的lambda目录,执行以下操作:

  • 初始化package.json(若未创建):
    npm init -y
    
  • 安装所需依赖:
    npm install @aws-sdk/client-dynamodb @aws-sdk/lib-dynamodb
    
  • 若使用TypeScript,需确保已将TS代码编译为JS,并将编译后的文件、node_modules、业务代码放在同一个lambda目录下(CDK会打包整个目录)。

2. 修复Lambda入口的字段名匹配

修改Lambda入口代码中的switch case,将createTodo改为addTodo,与CDK中配置的Resolver字段名一致:

exports.handler = async (event: AppSyncEvent) => {
switch (event.info.fieldName) {
    case "getTodo":return await getTodo();
    // 修正此处字段名
    case "addTodo":return await addTodo(event.arguments.todo);
    case "updateTodo":return await updateTodo(event.arguments.todo);
    case "deleteTodo":return await deleteTodo(event.arguments.todoId);
    default:return null;
}
}

3. 验证文件导入路径正确性

检查所有导入语句对应的文件是否存在且路径正确:

  • 确认lambda目录下存在update.js(对应import { updateTodo } from './update')
  • 确认lambda目录下存在delete.js(对应import { deleteTodo } from './delete')
  • 确认lambda目录下存在todo.js/todo.ts(对应import todo from "./todo")
  • 注意:Linux环境下文件名区分大小写,需确保导入路径与实际文件名完全一致。

4. (可选)用Lambda层管理依赖(优化部署包大小)

如果不想将node_modules打包进业务代码包,可以用Lambda层统一管理依赖:
在CDK栈代码中添加层的定义,并关联到Lambda:

// 创建Lambda层
const lambdaDependenciesLayer = new lambda.LayerVersion(this, 'LambdaDependenciesLayer', {
  code: lambda.Code.fromAsset('lambda-layer'), // 提前将node_modules放入lambda-layer目录
  compatibleRuntimes: [lambda.Runtime.NODEJS_16_X],
  description: 'Contains AWS SDK v3 dependencies',
});

// 给Lambda添加层
const Lambda= new lambda.Function(this, "Lambda", {
  runtime: lambda.Runtime.NODEJS_16_X,
  code: lambda.Code.fromAsset("lambda"),
  handler: "index.handler",
  timeout: cdk.Duration.seconds(30),
  layers: [lambdaDependenciesLayer], // 添加这一行
})

这样部署后,Lambda控制台的层数会显示为1,解决层数为0的问题,同时多个Lambda可共享该层。

5. 重新部署CDK应用

执行以下命令重新部署:

cdk synth
cdk deploy

验证

部署完成后:

  1. 进入Lambda控制台,查看该函数的「层数」是否显示为1(若用层)或确认代码包已包含node_modules
  2. 在AppSync控制台执行GraphQL查询/突变,验证是否不再出现Runtime.importModuleError

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:40:21