【问题标题】:How should I handle node_modules on AWS Lambda using NodeJS?我应该如何使用 NodeJS 在 AWS Lambda 上处理 node_modules?
【发布时间】:2019-01-31 17:15:47
【问题描述】:

我已经开始在一个小型网站上使用AWS Lambda。我将有大约 10-15 个 lambdas 连接到不同的触发器(API、SQS 等)

我们将使用AWS SAM 来创建我们的堆栈,并使用NodeJS 来创建大多数 lambda 方法。

我进行了很多搜索以找到 node_modules 的最佳实践,但无法真正得出结论。大多数提议的解决方案都包含层,我无法真正理解我应该如何构建这些层以及它们如何与本地测试一起工作。

问题:

  1. “按原样”使用 node_modules 和将 node_modules 目录转换为层之间有什么区别?它会有益于性能吗?只有在加载冷 lambda 时才会受益吗?

  2. 如果层是解决方案,我是否应该为所有 lambda 使用一层(例如,某种 CI 脚本会在部署前“合并”它们)?或者使用所有 lambdas 中所有相同的 node_module 版本创建一个单一存储库解决方案?这似乎有点不干净,但我在寻找最佳解决方案时看到了类似的建议。

我正在寻找一种不会损害性能的体面解决方案,以及在部署之前在本地工作和测试我们的代码的选项。..

【问题讨论】:

  • 如果您将节点模块与代码捆绑在一起,您将无法直接从 aws-cli 读取/编辑代码,因为它很大。如果您可以不使用该选项,请继续将所有内容捆绑在一起。 AS 即使您为模块创建了一个层,您以后仍然可能会遇到较大的项目。

标签: node.js amazon-web-services aws-lambda aws-sam


【解决方案1】:

在一个层中分离库将在您的函数之间共享它们,从而减少包大小和冷启动时间。多少取决于您的应用程序,但我想说的是,对于少数功能,除非您使用大量库,否则将它们捆绑在部署包中会更简单。如果它增长到更多的函数和库配置,它可以帮助创建一个 lambda 层,但我不会从一开始就这样做。

【讨论】:

  • 谢谢。假设我有一个一年前编写的 lambda,并且没有改变,我有一个新的 lambda,我今天要写。我需要决定是继续使用旧版本的 lib(例如 redis 客户端)还是更新旧的 lambda 以使用新版本的客户端。这真的是这里的最佳做法吗? lambda 的好处之一不是隔离吗?在这种情况下为每个 lambda 创建一个层不是更好吗?
  • 创建层可以让你一次更新所有函数中的redis客户端并减少所有包大小,这是好的一面,但你必须测试所有函数是否与新的lib/new兼容层。使库保持最新对于安全性很重要,并且层对此有所帮助,但是您也可以使用包管理器来做到这一点。对于 10-15 个函数,我想说只是更新软件包更容易,除非库真的很大。如果涉及到更多,比如 50 个函数,更难管理库和包内的大量重复库,那么层会有很大帮助。
  • 假设新客户端没有重大更改,这是正确的。对我来说,这似乎是一个肮脏的解决方案。所以,让我进入你的观点。在部署之前以某种方式自动创建的所有 lambdas 的一层。在这种情况下,lambda 会很小,冷负荷会更快。顺便说一句,你知道层在冷负载上是如何加载的吗?
  • 是的,使用更新后的库进行测试是最困难的部分,但这与 lambda 无关。当你的 lambda 函数被加载执行时,它必须从 S3 下载包。使用层,库和文件将已经在文件系统中,因此加载较少。此外,如果您有不同的配置,请记住您一次最多可以使用 5 层。
  • 为了更好地理解冷启动,请查看“了解 AWS Lambda 中的容器重用”:aws.amazon.com/blogs/compute/container-reuse-in-lambda
猜你喜欢
  • 1970-01-01
  • 2019-01-31
  • 2017-09-27
  • 1970-01-01
  • 2016-04-11
  • 2020-08-06
  • 1970-01-01
  • 2019-02-04
  • 2020-08-15
相关资源
最近更新 更多