我想只在第一次执行 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