AWS Lambda调用函数(js sdk):超时重置为默认值

时间:2016-08-12 09:49:12

标签: javascript node.js aws-sdk aws-lambda

我正在运行Meteor(Node 4.4.7)应用程序,该应用程序在AWS Lambda上执行长时间操作。我从我的代码调用lambda函数并等待响应,然后继续下一次调用。我将超时设置为300000毫秒,如former question中所述(在我的代码中的Lambda和AWS.Lambda对象中)。

我的问题是,有时AWS.Lambda超时值会重置为默认值120000ms。由于我的Lambda函数需要更多时间来执行(但仍然少于最多300秒),我没有收到响应。此外,我发现我的函数根据默认的maxRetries值被调用了3次,甚至认为我将其设置为1。

我不知道重现它的步骤。这似乎是随机的。它通常在运行我的应用程序几天后发生。如果我检查AWS.Lambda对象的属性,它仍然具有300000ms超时值,尽管它的行为类似于默认的120000ms值。一旦发生这种情况,所有后续调用请求都会出现同样的问题,我必须重新启动应用程序才能使其再次运行。

请注意,在Lambda日志中,我看到函数正在正确执行。持续时间< 120s在我的代码中返回。持续时间>重试了120秒。

示例代码:

var options = {
  maxRetries: 1,
  httpOptions: {
    timeout: 300000
  }
};

var lambda = new AWS.Lambda(options);

var myEventObject = {...};
var payload = JSON.stringify('myEventObject');

var params = {
  FunctionName: 'myLambdaFunction'
  InvocationType: 'RequestResponse',
  LogType: 'None',
  Payload: payload
};

lambda.invoke(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

我尝试过的事情之一:为每次调用创建一个new AWS.Lambda()

2 个答案:

答案 0 :(得分:2)

根据SDK https://bitbucket.org/aschaer/movesense-device-lib/src/23b4512dbc128a8c1f17a33cd453160bc3256f67/samples/accelerometer_app/bin/?at=master,AWS.Lambda中的httpOptions.timeout密钥不是函数超时 - 它是套接字超时。这是有道理的,因为Lambda函数的默认超时是3秒,而不是2分钟。

您可以使用documentation方法更改代码中的函数超时。或者,如果您使用无服务器框架来部署Lambda函数,则可以在serverless.yml中设置超时。当然,您始终可以在AWS控制台中设置超时(我在使用无服务器/ CloudFormation部署时,控制台中设置的配置问题已被消除,但我不知道您是怎么做的#&# 39;重新部署 - 如果您只是阅读S3代码或上传ZIP,则不应该成为问题。

答案 1 :(得分:0)

您需要在lambda上设置调用lambda.invoke的超时,而不是在lambda.invoke本身上设置超时(就像使用options一样)。

因此,如果您LambdaA调用LambdaB,则LambdaA上的超时必须与LambdaB的超时相同(或高于),否则在LambdaB完成之前,LambdaA可能会超时。

我假设你提供的代码是在lambda中运行的。您需要在 lambda。

上设置超时

您用于创建AWS.Lambda的options可以在此处提供的代码中丢弃。