Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

I am running a Meteor (Node 4.4.7) application that performs long operations on AWS Lambda. I invoke the lambda function from my code and wait for the response before proceeding to the next invocation. I set the timeout to 300000ms as described in a former question (both on Lambda and in the AWS.Lambda object in my code).

My problem is that sometimes the AWS.Lambda timeout value is reset to the default value of 120000ms. As my Lambda function takes more time to execute (but still less than the max 300s), I don't receive the response. Furthermore I see that my function is invoked 3 more times as per the default maxRetries value, even thought I set it to 1.

I don't know the steps to reproduce it. It seems random. It usually happens after a couple of days running my app. If I check the properties of my AWS.Lambda object, it still has the 300000ms timeout value although it behaves like it has the default 120000ms value. Once this happens, all subsequent invocations requests have the same problem and I have to restart the app to make it work again.

Note that on the Lambda logs, I see that the functions is being executed properly. Duration < 120s returns in my code. Duration > 120s are retried.

Sample code:

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

Among the things I've tried: create a new AWS.Lambda() for each invocation.

like image 203
Daniel T Avatar asked Aug 12 '16 09:08

Daniel T


1 Answers

According to the SDK documentation, the httpOptions.timeout key in AWS.Lambda isn't the function timeout - it's the socket timeout. That makes some sense, because the default timeout for a Lambda function is 3 seconds, not 2 minutes.

You can change the function timeout in your code using the updateConfiguration method. Or, if you're using the Serverless Framework to deploy your Lambda functions, you can set the timeout in the serverless.yml. And of course, you can always set the timeout in the AWS console (I've had issues with configurations set in the console being wiped out when I deploy with Serverless/CloudFormation, but I don't know how you're deploying - it shouldn't be an issue if you're just reading code for S3 or uploading a ZIP).

like image 124
Shahein Moussavi Avatar answered Sep 26 '22 16:09

Shahein Moussavi