我可以在内存中配置故事并在 AWS Lambda 中使用它吗

Can i story config in memory and use it in AWS Lambda

我有 lambda 函数,它监听 dynamo 流并处理任何更新或插入 dynamo 的记录。

目前这个 lambda 代码有我想转换成配置的变量列表,因为这个列表可以改变。

所以我想让我的 lambda 函数从配置中读取这个列表,但我不想要任何网络调用,所以我不能每次都调用 s3/dynamo。我希望此配置存储在本地内存中。

我想初始化 lambda,在此初始化中,从 table 中读取此配置并将其存储在某个变量中,并在每次调用时使用它。

我可以这样做吗?

不,你不能。 Lambda 是无状态的——您不能指望在一次调用中读入内存的任何内容都可用于下一次调用。您需要将您的配置信息存储在某处,并在每次读回它。

我让我的 lambda 函数 (nodejs) 从 yaml 文件读取 static 配置文件。您可以根据需要对 json 文件执行相同的操作。该应用程序 在 运行 时间从 S3 读取动态数据,请注意这不是您想要的。

这意味着我能够将变量作为硬编码值移出代码,并有一个单独的配置文件,您可以使用 CI 工具或每个环境的此类工具更改预部署。这也意味着您可以根据需要从版本控制中排除您的配置。

唯一的缺点是配置必须在部署时使用 lamda 函数上传,因此它在 运行 时可以与其他 lambda 资产一起使用。据我所知,您无法在 运行 时间内写回配置。

您可以在 project folder I have a config.yml. I'm using a nodejs module node-yaml-config 中看到每次实例化 lambda 时将配置文件加载到内存中。它也不需要任何网络呼叫。

在配置文件中我有我需要的所有参数:

# Handler runtime config set
default:
  sourceRssUri: http://www.sourcerss.com/rss.php?key=abcd1234
  bucket: myappbucket
  region: us-east-1
  dataKey: data/rssdata
  dataOutKey: data/rssdata
  rssKey: myrss.xml

我在运行时加载了配置,然后可以通过键名引用我代码中的任何配置项。我只是碰巧用它来进行s3操作,你可以做任何事情。

const yaml_config = require("node-yaml-config");
const config = yaml_config.load(__dirname + "/config.yml");

const aws = require("aws-sdk");
const bbpromise = require("bluebird");
const s3 = bbpromise.promisifyAll(new aws.S3({}));

var params = {
    Bucket: config.bucket,
    Key: config.dataOutKey,
    Body: JSON.stringify(feed.entries),
    ContentType: "application/json"
};
s3.putObjectAsync(params).catch(SyntaxError, function(e) {
    console.log("Error: ", e);
}).catch(function(e) {
    console.log("Catch: ", e);
});

这使得为 lambda 处理程序添加新配置变得非常容易,因为我添加到 config.yml 的任何内容(例如 myNewVariable 现在都可以在处理程序中作为 config.myNewVariable 引用没有任何新工作。

它允许根据环境或在每次部署之前更改配置。然后在 lambda 执行期间,配置在处理程序之前加载并存储在本地内存中。