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

时间:2016-02-18 11:07:30

标签: amazon-web-services aws-lambda

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

我可以将数据放到数据库中,但会为每个lambda请求引发一个额外的查询并运行得更慢。

4 个答案:

答案 0 :(得分:3)

如果配置不经常变化,我会把它扔进S3并让每个lambda在启动时加载它。

如果它确实发生了很大变化,或者你想构建某种UI来更新设置,那么你可以去DB路线。如果你在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 :(得分:1)

在部署包中嵌入配置可提供性能,稳定性和一些成本节约

我正在使用的流程:

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

    1. 可以与新配置一起测试这些功能。配置动态加载时,这会更加困难
    2. 简易版本管理:一个功能版本只需要支持一个版本的配置文件
    3. 最佳装载时间
    4. 共享配置的价格是固定的(据我所知,没有任何部署功能的成本)。但是,部署函数需要一些时间
    5. 这是我在一年中大规模运行各种lambda函数的经验。无论如何,无需停机即可完成部署的挑战。

答案 2 :(得分:0)

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

直接向AWS Lambda添加环境变量可以降低存储成本和对AWS存储服务的不必要调用。

请参阅this文章,了解多个环境的实施情况

答案 3 :(得分:0)

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