如何在运行时识别 Lambda 版本的首次执行?



我想只在第一次执行 Lambda 版本时运行一些代码。(注意:我不是指冷启动场景,因为这会发生不止一次(。

不幸的是,computeInstanceInvocationCount在每次冷启动时都会重置为 0。

functionVersion是一个可用的属性,但除非我将其存储在 lambda 之外的内存中,否则我无法计算它是否确实是第一次执行。

是否可以根据事件或上下文中的运行时值推断出这一点?还是有其他办法?

无法知道这是否是 Lambda 第一次从传递到 Lambda 的任何信息中运行。

您必须通过在那里设置标志或参数来包含检查其他地方的功能,但请记住,尽管可以同时调用 Lambda 的多个副本,因此为此的任何数据存储都可能需要是事务性的,以确保它只发生一次。

您可以尝试的一种方法是使用 AWS 参数存储。

在每次部署时,使用 更新参数存储值

{"version":"latest","is_firsttime":true}

因此,请在部署后运行以下命令

aws secretsmanager update-secret --secret-id demo --secret-string  '{"version":"latest","is_firsttime":true}'

因此,这是我们在部署之前需要确保的事情。

现在我们可以在 lambda 中设置逻辑,在演示中我们只研究is_firsttime

var AWS = require('aws-sdk'),
region = "us-west-2",
secretName = "demo",
secret,
decodedBinarySecret;
var client = new AWS.SecretsManager({
region: region
});
client.getSecretValue({SecretId: secretName}, function(err, data) {
secret = data.SecretString;
secret=JSON.parse(secret)
if ( secret.is_firsttime == true)
{
console.log("lambda is running first time")
//  any init operation here
// init completed, now we are good to set back it `is_firsttime` to false
var params = {
Description: "Init completeed, updating value at date or anythign", 
SecretId: "demo",
SecretString : '[{ "version" : "latest", "is_firsttime": false}]'
};
client.updateSecret(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else     console.log(data);           // successful response
});

}
else{
console.log("init already completed");
// rest of logic incase of not first time
}
})

这只是一个演示代码,可以在非 lambda 环境中工作,请相应地进行调整。

首次预期响应

{
ARN: 'arn:aws:secretsmanager:us-west-2:12345:secret:demo-0Nlyli',
Name: 'demo',
VersionId: '3ae6623a-1111-4a41-88e5-12345'
}

第二次

init already completed

最新更新