使用Layer时AWS Lambda无法导入模块:找不到包的常见问题
以下是几个容易遗漏的排查点,对应你遇到的aws-jwt-verify模块找不到的情况:
Layer目录结构错误
Node.js Lambda Layer要求模块必须放在nodejs/node_modules层级下,Lambda会自动将Layer的nodejs目录加入NODE_PATH。解压你的Layer压缩包,确认目录结构是nodejs/node_modules/aws-jwt-verify,如果直接把node_modules放在压缩包根目录,Lambda完全找不到模块。打包时未匹配Lambda运行环境
如果你在本地Windows/macOS直接npm install依赖,会生成对应平台的二进制文件,上传到Linux环境的Lambda后会加载失败。正确做法是针对Lambda架构安装依赖:# 针对x86_64架构 npm install --platform=linux --arch=x64 aws-jwt-verify # 针对arm64架构 npm install --platform=linux --arch=arm64 aws-jwt-verify之后再将
nodejs目录打包成Layer zip。ES模块相关配置缺失
如果你在Lambda函数代码中使用import语法,需要确保函数根目录的package.json中添加了"type": "module"字段——Node.js 18.x默认以CommonJS模式运行,没有这个配置会导致ES模块加载逻辑异常。Lambda与Layer关联异常
检查Lambda控制台的「Layers」标签,确认关联的是正确的Layer版本,有时候修改Layer后未发布新版本就重新测试,或者关联操作未保存,都会导致还是用旧的无效Layer。如果是跨账号Layer,还要确认Lambda执行角色有lambda:GetLayerVersion权限。导入路径写法错误
确保导入语句直接使用包名,不要写相对路径:// 正确写法 import { CognitoJwtVerifier } from 'aws-jwt-verify'; // 错误写法(不要加相对路径) import { CognitoJwtVerifier } from './node_modules/aws-jwt-verify';Layer模块会被自动加入NODE_PATH,直接引用包名即可被Node.js识别。
Lambda缓存干扰
Lambda存在代码缓存机制,即使更新了Layer,旧的缓存可能还在生效。可以尝试发布新的Layer版本并重新关联,或者创建一个全新的测试Lambda函数关联Layer,验证是否能正常加载模块。
内容的提问来源于stack exchange,提问作者robert smith

