我有一个AWS Lambda函数,配置为处理来自单个主题的SNS事件。当函数运行时,如果发生某些错误,它可能会发送一些其他通知并调用context.succeed或context.fail。 问题是同样的SNS事件似乎多次调用Lambda。查看CloudWatch日志,我看到了
START RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 Version: $LATEST
最终结束
END RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1
REPORT RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 ...
在相同的日志中立即跟随完全相同的RequestID
开始 START RequestId: cd7afdf8-2816-11e6-bca2-6f2e3027c5e1 Version: $LATEST
在发送此SNS事件的主题中查看CloudWatch,它似乎只是按照我的预期发布和发送一个,所以它似乎是一个Lambda方面的问题。有没有人知道某个事件可能会像这样多次触发我的lambda?
编辑:我注意到,当lambda收到失败时,这似乎正在发生。我没有在lambda上看到任何类型的重试配置,并且不希望它默认以这种方式运行。
答案 0 :(得分:9)
来自Amazon lambda常见问题解答页面 https://aws.amazon.com/lambda/faqs/
问:如果我的Lambda函数在处理事件期间失败会怎样?
失败时,同步调用的Lambda函数将以异常响应。异步调用的Lambda函数至少重试 3次,之后可能会拒绝该事件。 Amazon Kinesis流和Amazon DynamoDB流中的事件将重试,直到Lambda函数成功或数据过期。 Kinesis和DynamoDB Streams保留数据24小时。
答案 1 :(得分:3)
我有一个与lambda cron作业函数类似的问题。我需要向服务/ api发送一个请求,该服务运行几秒钟才能返回第一个字节/响应(不需要响应处理),所以我的修复如下:
exports.handler = (event, context, callback) => {
// TODO implement
var https = require("https");
token = "xxxxxxxx";
var options = {
host: "api.xxxxx.com",
path: "/manage/cronjob/video",
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer "+token
}
};
var req = https.request(options);
req.write("");
req.end();
//add timeout for context.done()
setTimeout(function(){
context.done();
callback(null, 'Hello from Lambda');
},1000); //This timeout should be lower than the lambda's timeout };
在这个示例中,我们有一个显式的回调来强制lambda退出,在函数获得超时错误&触发另外2次重试
希望有所帮助