当前位置: 首页 > 知识库问答 >
问题:

如何在AWS lambda中加载npm模块?

堵龙野
2023-03-14

我已经使用基于web的编辑器创建了几个Lambda函数。到目前为止还不错。现在我想开始扩展那些模块(比如Q表示承诺)。我不知道如何将这些模块输出到Lambda,这样它们就可以被我的函数使用了。

我已经通读了这篇文章,但它似乎涉及到设置EC2并从那里运行Lambda函数。在创建函数时有一种上传zip的机制,但这似乎涉及到发送本地开发的函数。因为我在基于web的编辑器中工作,这似乎是一个奇怪的工作流程。

我如何简单地部署一些模块,以便在我的Lambda函数中使用?

共有2个答案

相野
2023-03-14

为了在lambda中包含npm模块,需要.zip文件。而且您确实不应该使用Lambda web编辑器进行任何事情--就像使用任何生产代码一样,您应该在本地开发,使用git等。

1)我的Lambda函数通常是较大项目的助手实用程序,因此我在其中创建了/aws/lambdas目录来存放它们。

2)每个单独的lambda目录都包含一个包含函数代码的index.js文件、一个定义依赖关系的package.json文件和一个/node_modules子目录(lambda不使用package.json文件,它只是为了让我们可以在本地运行npm install命令。)

package.json:

{
  "name": "my_lambda",
  "dependencies": {
    "svg2png": "^4.1.1"
  }
}

3)I.gitignore所有node_modules目录和.zip文件,以便npm安装和压缩生成的文件不会干扰我们的回购。

.Gitignore:

# Ignore node_modules
**/node_modules

# Ignore any zip files
*.zip

4)我从目录中运行npm install来安装模块,并在本地开发/测试功能。

5)I.压缩lambda目录并通过控制台上传。

(重要提示:不要从Finder中使用mac的“compress”实用程序来压缩文件!您必须从目录根目录中的CLI运行压缩-请参见此处)

zip -r ../yourfilename.zip * 

注:

如果在Mac上本地安装节点模块,您可能会遇到问题,因为某些特定于平台的模块在部署到Lambda的基于Linux的环境时可能会失败。(见https://stackoverflow.com/A/29994851/165673)

解决方案是在从AMI启动的EC2实例上编译模块,该AMI与您正在使用的Lambda node.js运行时相对应(请参见Lambda运行时及其各自的AMI的列表)。

另请参见node.js中的AWS Lambda部署包-AWS Lambda

晋越彬
2023-03-14

如果不上传.zip文件,就无法加载NPM模块,但实际上可以将此过程简化为两个快速命令行。

如下所示:

>

  • 将Lambda函数文件放在单独的目录中。这是因为您在本地为Lambda安装了npm包,并且希望能够隔离和测试将上载到Lambda的内容。

    使用NPM Install packagename在本地安装NPM包,同时在步骤#1中创建的单独的Lambda目录中安装。

    确保函数在本地运行时正常工作:Node lambdafunc.js(您可以简单地注释掉代码中的两行export.handler以使代码适合在本地使用Node运行)。

    转到lambda的目录并压缩内容,确保不包括目录本身。

    zip -r lambdaFunc.zip .
    

    如果您已经安装了AWS-CLI(如果您想让您的生活更轻松,我建议您安装它),那么您现在可以输入以下命令:

    aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip
    

    (上面的lambdaFunc部分没有引用,以防你和我一样疑惑)

    现在您可以在Lambda控制台中单击test。

    我建议为上面的两个命令都添加一个简短的别名。下面是我在Lambda update命令中使用的更长的内容:

    alias up="aws lambda update-function-code --function-name lambdaFunc \
    --zip-file fileb://~/path/to/your/lambdaFunc.zip"
    

  •  类似资料:
    • 问题内容: 正如公知的,任何NPM模块可以通过运行一个简单的命令被安装:。 我已经安装了一些不再使用的模块,我只想把它们取下来。我对此有一些疑问: 我们是否有任何命令或过程可以从根目录卸载模块(例如),还是仅删除模块文件即可? 如果我们保留未使用的模块,它将对我们有何影响? 问题答案: 该命令很简单 Node.js文档https://npmjs.org/doc/具有npm所需的所有命令。 本地安装

    • 如何卸载Node.js中具有devDependence的<code>npm

    • 问题内容: 我有一个问题问你: 我想在Jena TDB TripleStore上加载文件。我的文件很大,大约80Mb和大约700000的三倍RDF。当我尝试加载它时,执行将停止工作或需要很长时间。 我正在使用在Web服务上运行的以下代码: 有时我会收到Java堆空间错误: 如何将这个文件加载到模型Jena中并将其保存在TDB中?提前致谢。 问题答案: 您需要在statup上为JVM分配更多的内存。

    • 问题内容: Deno超级酷。我早上看过它,现在想迁移到deno。我试图将现有的nodejs脚本移至deno。谁能帮助我使用deno中的npm模块。我需要esprima模块。这个有包https://github.com/denoland/deno_third_party/tree/master/node_modules,但是我不知道怎么使用。 问题答案: Deno提供了一个节点兼容性库,该库将允许使

    • 问题内容: 跟进有关重新加载模块的问题,如何从已更改的模块重新加载特定功能? 伪代码: 问题答案: 您想要的是可能的,但是需要重新加载两件事……首先,但是您还必须这样做(假设是包含该语句的模块的名称)。 至于为什么…第一次加载时,将创建一个对象,其中包含一个对象。当您导入到模块,它存储到一个参考。当被调用时,对象被消隐,并且该模块重新执行。这意味着所有引用仍然有效,但是已经创建了一个新对象…因此,

    • 如何卸载Node.js中具有开发依赖项的模块?