使用AWS lambda,该lambda内部有一个带有lambda层的package.json



我有一个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一起可用

最新更新