AWS Lambda迁移至eu-central-1后require未定义错误求助
问题原因分析及解决方案
核心原因
模块解析模式冲突
报错「require is not defined in ES module scope」表明代码被Node.js识别为ES模块(ECMAScript Module),而ES模块环境不支持CommonJS的require()语法。相同代码在us-east-1正常运行,大概率是eu-central-1区域的Lambda代码包中意外包含了package.json且配置了"type": "module",或是代码文件后缀被改为.mjs,导致环境解析规则变更。AWS SDK预装版本差异
- Node.js 16的Lambda runtime默认预装AWS SDK v2(包名
aws-sdk),覆盖所有AWS服务客户端,因此无需手动安装即可通过require('aws-sdk')调用DynamoDB。 - Node.js 18的Lambda runtime默认预装AWS SDK v3(模块化独立客户端,如
@aws-sdk/client-dynamodb),不再提供统一的aws-sdk包。你之前修改的require("@aws-sdk/client-s3")是S3的专属客户端,与DynamoDB场景不匹配;直接使用import时因未指定正确的v3模块路径,导致文件找不到。
解决方案
场景1:沿用Node.js 16(与原环境一致)
- 检查eu-central-1区域Lambda的代码包,确保无额外的
package.json文件;若存在,删除其中的"type": "module"配置。 - 保留原代码的
const AWS = require('aws-sdk')语句,Node.js 16的Lambda预装了v2 SDK,无需额外安装即可直接运行。
场景2:切换至Node.js 18(适配新版Runtime)
方式1:使用预装的v3 SDK(推荐)
无需手动安装依赖,直接用ES模块语法导入DynamoDB相关组件:
import { DynamoDBClient, BatchWriteItemCommand } from "@aws-sdk/client-dynamodb"; import { marshall } from "@aws-sdk/util-dynamodb"; // 用于将JS对象转换为DynamoDB格式 // 初始化客户端 const client = new DynamoDBClient({ region: "eu-central-1" }); // 批量写入示例 const batchParams = { RequestItems: { "YourTargetTableName": [ { PutRequest: { Item: marshall({ id: "item-1", content: "sample data" }) } } ] } }; const command = new BatchWriteItemCommand(batchParams); const response = await client.send(command);
方式2:坚持使用CommonJS语法
在代码包中添加package.json,配置"type": "commonjs"以强制使用CommonJS解析模式,然后用require导入v3模块:
const { DynamoDBClient, BatchWriteItemCommand } = require("@aws-sdk/client-dynamodb"); const { marshall } = require("@aws-sdk/util-dynamodb");
Node.js 18的Lambda已预装这些v3模块,无需执行npm install再打包。
通用排查步骤
- 对比原区域与新区域的Lambda代码包,确保内容完全一致(无额外配置文件或后缀变更)。
- 在Lambda控制台确认运行时版本选择与代码语法匹配。
补充说明:原区域无需安装SDK的原因
AWS Lambda的Node.js Runtime会默认预装对应版本的AWS SDK:
- Node.js 10/12/14/16版本:预装统一的AWS SDK v2(
aws-sdk包),涵盖所有服务的客户端实现,因此可直接调用。 - Node.js 18及以上版本:预装模块化的AWS SDK v3,仅包含各服务的独立客户端包,需按需导入对应服务的模块。
内容的提问来源于stack exchange,提问作者Jasper Tavernier
相关产品推荐
相关产品推荐

