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

AWS Lambda invoke function (js sdk): timeout resets to default

本文关键字:timeout 默认值 sdk 调用 Lambda 函数 js AWS      更新时间:2023-09-26

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

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

我不知道复制它的步骤。看起来很随意。它通常发生在几天后运行我的应用程序。如果我检查我的AWS.Lambda对象的属性,它仍然有300000ms超时间值,尽管它的行为就像它有默认的120000ms值。一旦发生这种情况,所有后续的调用请求都有同样的问题,我必须重新启动应用程序使其再次工作。

请注意,在Lambda日志中,我看到函数正在正确执行。持续时间& lt;120在我的代码中返回。持续时间大于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()

根据SDK文档,AWS中的httpOptions.timeout键。Lambda不是函数超时-它是套接字超时。这是有道理的,因为Lambda函数的默认超时是3秒,而不是2分钟。

您可以使用updateConfiguration方法在代码中更改函数超时。或者,如果您使用无服务器框架来部署Lambda函数,则可以在Serverless .yml中设置超时。当然,您总是可以在AWS控制台中设置超时(当我使用Serverless/CloudFormation部署时,我在控制台中设置的配置被清除了,但我不知道您是如何部署的-如果您只是阅读S3代码或上传ZIP,这应该不是问题)。

需要设置调用lambda的lambda的超时时间。调用,而不是在lambda上。调用自己(就像你对options所做的那样)。

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

我假定您提供的代码在lambda中运行。您需要在上设置 lambda的超时时间。

用于创建AWS的options。Lambda可以在这里提供的代码中被丢弃。