在 AWS Lambda 函数之间共享公共数据

share common data between AWS Lambda functions

如果我有一组通用配置,例如一组由多个 Lambda 函数使用的常量。有什么方法可以在一个地方共享它们之间的数据,这样我就可以轻松修改值,而无需在每个 lambda 函数内部逐一更新?

我可以将数据放入数据库,但会导致对每个 lambda 请求进行一次额外查询,并且 运行 速度变慢。

如果配置不会经常更改,我会把它放在 S3 中,让每个 lambda 在启动时加载它。

如果它确实发生了很大变化,或者您想构建某种 UI 来更新设置,那么您可以走数据库路线。如果您在 lambda 启动时加载配置 - 即在处理程序函数之外,只要 lambda 不返回睡眠状态,您只需要加载一次配置,所以惩罚可能不会那么陡峭。

// this will only be loaded when the Lambda starts up
// keep in mind if you are loading from an external resource
// it will probably be async so your function should return a Promise
var config = someFunctionThatLoadsConfigFromS3();

// entry point for Lambda will be called for every event(api gateway request)
module.exports.handler = function(event, context) {
  config.then(function(config) {
    // do some stuff with config
    context.done(null, 'return a value');
  }).catch(....); 
};

在部署包中嵌入配置可提供性能、稳定性并节省一些成本

我正在使用的流程:

  1. 将配置存储在文件中(可能是 git 存储库)
  2. 将配置文件作为依赖项包含在所有相关的 Lambda 函数中
  3. 将构建环境设置为在文件更改时构建、测试和部署所有相关函数

一些好处:

  1. 功能可以和新配置一起测试。当动态加载配置时,这会更加困难
  2. 轻松的版本管理:一个功能版本只需要支持一个版本的配置文件
  3. 最佳加载时间
  4. 共享配置的价格是固定的(据我所知,部署功能没有任何成本)。但是,部署功能需要一些时间

这是我一年来大规模使用 运行 各种 lambda 函数集的经验。无论如何都需要解决在不停机的情况下进行部署的挑战。

您是否使用 AWS cloudformation 来配置这些 lambda?如果是这样,您可以将公共配置变量传递到您的主堆栈,将任何必要的项目继承到子 lambda 堆栈,并将它们添加为 environment variables

将环境变量直接添加到 AWS Lambda 可减少存储成本和对 AWS 存储服务的不必要调用。

请参阅 this 文章了解跨多个环境的实施

您可以使用 Lambda Layers 在不同的 lambda 函数之间共享代码。然后,lambda 中的代码将在 /opt 文件夹中的每个函数中可用。