我正在运行Meteor(Node 4.4.7)应用程序,该应用程序在AWS Lambda上执行长时间操作。我从我的代码调用lambda函数并等待响应,然后继续下一次调用。我将超时设置为300000毫秒,如former question中所述(在我的代码中的Lambda和AWS.Lambda对象中)。
我的问题是,有时AWS.Lambda
超时值会重置为默认值120000ms。由于我的Lambda函数需要更多时间来执行(但仍然少于最多300秒),我没有收到响应。此外,我发现我的函数根据默认的maxRetries
值被调用了3次,甚至认为我将其设置为1。
我不知道重现它的步骤。这似乎是随机的。它通常在运行我的应用程序几天后发生。如果我检查AWS.Lambda
对象的属性,它仍然具有300000ms超时值,尽管它的行为类似于默认的120000ms值。一旦发生这种情况,所有后续调用请求都会出现同样的问题,我必须重新启动应用程序才能使其再次运行。
请注意,在Lambda日志中,我看到函数正在正确执行。持续时间< 120s在我的代码中返回。持续时间>重试了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()
。
答案 0 :(得分:2)
根据SDK https://bitbucket.org/aschaer/movesense-device-lib/src/23b4512dbc128a8c1f17a33cd453160bc3256f67/samples/accelerometer_app/bin/?at=master,AWS.Lambda中的httpOptions.timeout
密钥不是函数超时 - 它是套接字超时。这是有道理的,因为Lambda函数的默认超时是3秒,而不是2分钟。
您可以使用documentation方法更改代码中的函数超时。或者,如果您使用无服务器框架来部署Lambda函数,则可以在serverless.yml中设置超时。当然,您始终可以在AWS控制台中设置超时(我在使用无服务器/ CloudFormation部署时,控制台中设置的配置问题已被消除,但我不知道您是怎么做的#&# 39;重新部署 - 如果您只是阅读S3代码或上传ZIP,则不应该成为问题。
答案 1 :(得分:0)
您需要在lambda上设置调用lambda.invoke的超时,而不是在lambda.invoke本身上设置超时(就像使用options
一样)。
因此,如果您LambdaA
调用LambdaB
,则LambdaA
上的超时必须与LambdaB
的超时相同(或高于),否则在LambdaB完成之前,LambdaA
可能会超时。
我假设你提供的代码是在lambda中运行的。您需要在 lambda。
上设置超时您用于创建AWS.Lambda的options
可以在此处提供的代码中丢弃。