Lambda多次处理相同的SNS事件?

时间:2016-06-01 20:56:12

标签: amazon-web-services amazon-sns aws-lambda

我有一个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上看到任何类型的重试配置,并且不希望它默认以这种方式运行。

2 个答案:

答案 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次重试

希望有所帮助