使用Dynamodb和SNS的Lambda函数 - 超时

时间:2018-01-02 10:24:37

标签: lambda amazon-dynamodb

我试图在SNS服务中使用DynamoDb Item值来发送通知。它失败了超时错误但是从Dynamodb获取成功并且还发送了通知。但它会在处理多次后继续重试和超时。

  

{     “errorMessage”:“2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时”   }

现在,我也尝试使用参数context.callbackWaitsForEmptyEventLoop = false,但dint帮助很多!!似乎没有正确使用它。

下面是一段代码,有人可以帮忙:

exports.handler = function (event, context, callback) {

var AWS = require('aws-sdk');
var doc = require('dynamodb-doc');
var dynamodb = new doc.DynamoDB();

var params = {    
TableName : 'abcmsg',
ProjectionExpression: 'Message',
  Key : { 
   "ind" : "ABC10"
    }
};

var MESSAGE_ID = getmsg();

function getmsg(MESSAGE_ID) {
dynamodb.getItem(params, function (err, data) {
        if (err) {
             console.log('ERROR: Dynamo Failed:', err);
             getmsg(err);
        } else {
               console.log('Dynamo Success: ' + JSON.stringify(data, null, '  ')); 
               let MESSAGE_ID = data['Item'].Message;
               console.log('data',data['Item'].Message); 
               getmsg(MESSAGE_ID);        
        }
});


console.log('MESSAGE_ID',MESSAGE_ID); //print the correct value 'ABCD'

var sns = new AWS.SNS({
      region:'eu-west-1',
      maxRetries: 0

});

sns.publish({
Message: MESSAGE_ID,
Subject:"Test Message",
TopicArn:"arn:aws:sns:eu-west-1:0123456789012:Lambda"
}, function (err, data) {
if (err) {
console.log(err.stack);
return;
}
console.log('push sent');
});

callback(null,{ "statusCode": 200 });
context.callbackWaitsForEmptyEventLoop = false;

}

};

日志:-----

2018-01-02T10:14:55.005Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.005Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.006Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.028Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.086Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.105Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.106Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.127Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.167Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.185Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.186Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.226Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.253Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.265Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.285Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.306Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.345Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.365Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD 2018-01-02T10:14:55.366Z c18d142e-efa5-11e7-8671-7f3af13c58c7 MESSAGE_ID ABCD 2018-01-02T10:14:55.386Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.406Z c18d142e-efa5-11e7-8671-7f3af13c58c7推送 2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7发电机成功:{   “项目”:{     “消息”:“ABCD”   } } 2018-01-02T10:14:55.445Z c18d142e-efa5-11e7-8671-7f3af13c58c7数据ABCD END RequestId:c18d142e-efa5-11e7-8671-7f3af13c58c7 报告RequestId:c18d142e-efa5-11e7-8671-7f3af13c58c7持续时间:10010.15 ms结算时长:10000 ms内存大小:128 MB最大使用内存:44 MB
2018-01-02T10:14:55.463Z c18d142e-efa5-11e7-8671-7f3af13c58c7任务在10.01秒后超时

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试使用键值"ind" : "ABC10"获取项目并通知使用SNS。

在这种情况下,成功sns.publish时应调用getItem,即代替getmsg(MESSAGE_ID),应调用sns publish function(即您需要创建一个sns publish code block发布消息)或者应该执行Person personToFind = new Person("Doe", "Jane"); Person person = persons.stream() .filter(p -> p.equals(personToFind)) .findFirst() .orElseGet(() -> persons.stream() .filter(p -> p.getSurname().equals(personToFind.getSurname())) .findFirst() .orElseThrow(() -> new RuntimeException("Could not find person ...")) ); (即只需将sns发布代码块复制并粘贴到getItem else部分内)。

我不明白你为什么要调用getmsg(错误)(即在getItem错误时)或getmsg(MESSAGE_ID)(即getItem成功)?我认为这是正确。它基本上是在循环中调用getItem,导致超时错误。