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

强颜欢笑 提交于 2020-12-03 07:50:55

问题


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.


回答1:


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).




回答2:


You need to set the timeout on the lambda that is calling lambda.invoke, not on the lambda.invoke itself (as you are doing with options).

So, if you have LambdaA that invokes LambdaB, the timeout on LambdaA has to be the same as (or higher than) the timeout for LambdaB, otherwise LambdaA will potentially timeout before LambdaB completes.

I presume that the code you are providing is running in a lambda. You need to set the timeout on that lambda.

The options you are using to create AWS.Lambda can be discarded in the code you've provided here.



来源:https://stackoverflow.com/questions/38914954/aws-lambda-invoke-function-js-sdk-timeout-resets-to-default

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!