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

2024-02-18

我正在运行一个 Meteor (Node 4.4.7) 应用程序,该应用程序在 AWS Lambda 上执行长时间操作。我从代码中调用 lambda 函数并等待响应,然后再继续下一次调用。我将超时设置为 300000ms,如前一个问题 https://stackoverflow.com/questions/36648377/aws-lambda-invoke-function-doesnt-always-return(在 Lambda 上和我的代码中的 AWS.Lambda 对象中)。

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

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

请注意,在 Lambda 日志中,我看到函数正在正确执行。我的代码中返回 Duration 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文档 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#constructor-property, the httpOptions.timeoutAWS.Lambda 中的关键不是函数超时 - 而是套接字超时。这是有道理的,因为 Lambda 函数的默认超时是 3 秒,而不是 2 分钟。

您可以使用以下命令更改代码中的函数超时更新配置 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#updateFunctionConfiguration-property方法。或者,如果您使用 Serverless Framework 部署 Lambda 函数,则可以在 serverless.yml 中设置超时。当然,您始终可以在 AWS 控制台中设置超时(当我使用 Serverless/CloudFormation 进行部署时,我遇到了控制台中设置的配置被删除的问题,但我不知道您是如何部署的 - 它如果您只是阅读 S3 代码或上传 ZIP,那么这应该不是问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Lambda 调用函数(js sdk):超时重置为默认值 的相关文章

随机推荐