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

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

我的问题是,有时AWS.Lambda超时值被重置为默认值120000毫秒。 由于我的Lambda函数需要更多时间来执行(但仍小于最大值300),所以我没有收到响应。 此外,我看到我的函数被调用了3次,按照默认的maxRetries值,甚至认为我把它设置为1。

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

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

示例代码:

 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 }); 

在我尝试的事情中:为每个调用创build一个new AWS.Lambda()

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

您可以使用updateConfiguration方法更改代码中的函数超时值。 或者,如果您使用无服务器框架部署Lambda函数,则可以在serverless.yml中设置超时。 当然,您可以随时在AWS控制台中设置超时时间(当我使用Serverless / CloudFormation进行部署时,我在控制台中设置的configuration已经被删除,但我不知道如何部署 – 如果您只是阅读S3的代码或上传ZIP,则不应成为问题)。