我有一个AWS Lambda,它的文件夹结构是:
src-ts
│ app.js
│ package.json
│
└───
在Lambda的package.json中,我有一个依赖项列表,type
设置为module
。
然后我有一个Lambda层,它的文件夹结构是这个
nodejs
│ node_modules
│ package.json
│ package-lock.json
└──────
我的layers package.json与我的Lambda中的那个完全相同。
当我尝试运行lambda时,我会得到一个"Cannot find module '/opt/nodejs/node14/node_modules/@aws-sdk/credential-provider-node' imported from /var/task/src-ts/app.js",
错误。我认为这个错误与我的Lambdas本地包.json.有关
我试图将导入更改为使用/opt/nodejs/node14/node_modules/@aws-sdk/credential-provider-node'
,而仅使用/opt/@aws-sdk/credential-provider-node
,但这两次尝试都没有成功。
我最终将tsconfig.json
中的module
设置更改为commonjs
,并在不同的时间将我的transpiled JS重新部署到Lambda,这一次里面没有package.json,我的Lambda按预期工作。
有没有办法将package.json与部署的Lambda放在同一文件夹中,并使用来自AWS Lambda层的依赖项?
谢谢你的帮助!
我在lambda和层中多次使用这样的设置和package.json。lambda中的代码可以从层的package.json中导入库,方法与在其自己的package.json中列出依赖项时相同。
因此,根据您使用的是commonjs还是模块,您将使用
const aws = require("@aws-sdk/credential-provider-node");
或
import aws from "@aws-sdk/credential-provider-node";
您只需要使用/opt/。。。导入在图层中的文件中定义的模块时的路径。
编辑:我还应该注意,我没有尝试在两个package.json文件中列出相同的依赖项。我不确定这是否会引起冲突。
第2版:当我自己研究解决一个问题时,我遇到了许多关于在lambda层和AWS SDK中使用ES模块的问题的报告。因此,既然您已经提到在切换到commonjs时它是有效的,那么这很可能是您的问题的根源。在这些Github问题中提到了多种潜在的解决方案。
请参阅:
使用ES模块和Lambda Layer 时找不到包
使AWS SDK JS v2和v3与AWS Lambda 中的ESM一起可用