2017-08-29 112 views
1

的第一次我登录到我的应用程序,第一件事就是在早上返回UnexpectedLambdaException超时错误,AWS Cognito返回此错误:Cognito在调用lambda函数

{ 
    "message": "arn:aws:lambda:us-east-1:XXXXXXXXXX:function:main-devryan-users_onCognitoLogin failed with error Socket timeout while invoking Lambda function.", 
    "code": "UnexpectedLambdaException", 
    "time": "2017-08-29T13:30:01.351Z", 
    "requestId": "1c04c982-8cbe-11e7-b9c9-a584e55a17f8", 
    "statusCode": 400, 
    "retryable": false, 
    "retryDelay": 96.636396268355 
} 

第二次和以后的每一次剩下的时间,一切都很好。

REPORT RequestId: 1f2d5a22-8cbe-11e7-ba74-5b21665a40c1 Duration: 2283.60 ms Billed Duration: 2300 ms Memory Size: 128 MB Max Memory Used: 51 MB 

每次算账,一天的休息,我没有看到:

当我检查的CloudWatch的日志我的主devryan-users_onCognitoLogin功能,它2.3秒成功完成这个错误。我的Lambda在30秒后设置为超时,但我知道Cognito needs a response in 5 seconds

我的lambda函数只是更新数据库中的最后登录时间。这是第一次,因为它需要约1.8秒来创建一个连接到我的RDS数据库。我为这部分使用了带有Sequelize 3的Node JS 6。

我猜测花了2.7秒让Lambda将我的应用加载到一个容器中。

有没有人在这里解决?我很难过。

回答

2

这似乎是一个lambda冷启动时间问题。有多种方法可以尝试对此进行优化,例如:

  1. 增加分配给您的函数的内存,这也会按比例增加CPU。由于您的功能很少被调用,增加内存大小的额外成本将通过更快的冷启动时间和更低的计费时间来平衡。

  2. 缩小您的代码大小:更小的.zip,在Node.js中删除不必要的require()等。例如,如果您要包含Async库以删除嵌套的回调,请考虑放弃提高性能。 onLoginactualOnLogin

0

我通过创建2个lambda表达式解决了这个问题。Lambda只是异步启动actualOnLogin Lambda并立即返回。 actualOnLogin做我的数据库更新。这种方式onLogin返回< 100ms和Cognito很高兴。

下面是onLogin的基本代码:

let AWS = require("aws-sdk"); 
let lambda = new AWS.Lambda(); 

let params = { 
    FunctionName: "[email protected][email protected]_actualCognitoLogin", // I'm using the Serverless framework 
    InvocationType: "Event", // Makes it async 
    LogType: "None", 
    Payload: JSON.stringify(event) 
}; 

lambda.invoke(params, (err, data) => { 
    if (err) { 
     console.log("ERROR: " + err, err.stack); // an error occurred 
     context.done(err, event); 
    } else { 
     console.log(data); // successful response 
     context.done(null, event); 
    } 
});