我有lambda函数,它监听dynamo流并处理发电机中任何更新或插入的记录。
目前这个lambda代码有我想要转换为配置的变量列表,因为这个列表可以改变。
所以我希望我的lambda函数从配置中读取此列表,但我不想要任何网络调用,所以我不能每次调用s3 / dynamo。我希望这个配置本地存储在内存中。
我想初始化lambda并在此初始化中从表中读取此配置并将其存储在某个变量中并在每次调用时使用它。
我可以这样做吗?
答案 0 :(得分:2)
我的lambda函数(nodejs)从yaml文件中读取 static 配置文件。您可以根据需要对json文件执行相同操作。应用程序还在运行时从S3读取动态数据,并指出这不是您想要做的。
这意味着我能够将变量作为硬编码值从代码中移出,并且有一个单独的配置文件,您可以使用CI工具或每个环境更改预部署。这也意味着如果需要,您可以从版本控制中排除配置。
唯一的缺点是配置必须在部署时使用lamda函数上传,因此在运行时它可与其他lambda资产一起使用。 AFAIK您无法在运行时写回配置。
您可以在project文件夹中看到我有config.yml
。我每次实例化lambda时都使用nodejs模块node-yaml-config将配置文件加载到内存中。它也不需要任何网络呼叫。
在配置文件中,我有我需要的所有参数:
# 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执行期间将其本地存储在内存中。
答案 1 :(得分:1)
不,你不能。 Lambda是无状态的 - 你无法指望在一次调用中读入内存的任何内容都可用于下一次调用。您需要将配置信息存储在某处,并在每次都读回来。