在AWS SAM本地环境中从Lambda Layer导入ES6 Node模块的问题
解决AWS SAM本地环境从Lambda Layer导入ES6模块问题
1. 修正Lambda Layer的文件结构
Lambda Layer的模块必须放在指定路径,SAM本地会将Layer挂载到/opt目录,Node.js才能识别。正确结构如下:
layers/ my-utils-layer/ nodejs/ node_modules/ uid/ # 你的ES6模块 package.json # 必须添加这个文件声明模块类型
在layers/my-utils-layer/nodejs/package.json中添加:
{ "type": "module" }
2. 配置SAM模板(template.yaml)
确保Layer定义正确,且Lambda函数关联该Layer:
Resources: MyUtilsLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: MyUtilsLayer ContentUri: layers/my-utils-layer/ CompatibleRuntimes: - nodejs18.x # 匹配你的Node.js运行时版本 RetentionPolicy: Retain MyLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: index.handler Runtime: nodejs18.x Layers: - !Ref MyUtilsLayer Environment: Variables: NODE_PATH: /opt/nodejs/node_modules # 让Node能找到Layer中的模块
3. 配置Lambda函数目录的package.json
在你的Lambda处理程序所在的src/目录下创建package.json,声明模块类型:
{ "type": "module" }
4. 本地测试命令
使用以下命令启动本地API或直接调用函数,确保Layer被正确加载:
# 启动本地API网关 sam local start-api # 直接调用Lambda函数(需准备event.json测试事件) sam local invoke MyLambdaFunction -e event.json
5. 常见排查点
- 确保本地Node.js版本与SAM模板中指定的
Runtime版本一致,避免模块兼容性问题 - 修改Layer内容后,可添加
--skip-pull-image参数重启本地服务,跳过镜像缓存重新加载Layer - 检查
ContentUri路径是否正确,必须指向包含nodejs目录的Layer根文件夹
内容的提问来源于stack exchange,提问作者Saleh Alaswad
相关产品推荐
相关产品推荐

