Cognito 在调用 Lambda 函数时返回 UnexpectedLambdaException 超时错误

Rya*_*ton 7 lambda amazon-web-services sequelize.js amazon-cognito

我第一次登录应用程序时,早上第一件事,AWS Cognito 返回此错误:

{
  "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
}
Run Code Online (Sandbox Code Playgroud)

第二次,以及此后接下来的每一次,一切都很好。

当我在 Cloudwatch 中检查 main-devryan-users_onCognitoLogin 函数的日志时,它在 2.3 秒内成功完成:

REPORT RequestId: 1f2d5a22-8cbe-11e7-ba74-5b21665a40c1  Duration: 2283.60 ms    Billed Duration: 2300 ms Memory Size: 128 MB    Max Memory Used: 51 MB  
Run Code Online (Sandbox Code Playgroud)

每次之后,在一天剩下的时间里,我都没有看到这个错误。我的 Lambda 设置为 30 秒后超时,但我知道Cognito 需要在 5 秒内响应

我的 lambda 函数只是更新数据库中的上次登录时间。第一次很慢,因为创建与 RDS 数据库的连接大约需要 1.8 秒。我在这部分使用 Node JS 6 和 Sequelize 3。

我猜测 Lambda 将我的应用程序加载到容器中需要 2.7 秒。

这里有人有解决办法吗?我很困惑。

Ion*_*ian 6

这似乎是 lambda 冷启动时间问题。您可以尝试采用多种方法来优化此问题,例如:

  1. 增加分配给函数的内存,这也会成比例地增加 CPU。由于您的函数被调用的频率非常低,因此增加内存大小所增加的成本将通过更快的冷启动时间和更低的计费持续时间来平衡。

  2. 减少代码大小:较小的 .zip、删除 Node.js 中不必要的 require() 等。例如,如果您只是为了删除嵌套回调而包含异步库,请考虑放弃它以提高性能。


Rya*_*ton 3

onLogin我通过创建 2 个 Lambdas:和解决了这个问题actualOnLogin。LambdaonLogin只是异步启动actualOnLoginLambda 并立即返回。actualOnLogin我的数据库会更新吗?这种方式onLogin在 <100 毫秒内返回,Cognito 很高兴。

这是 onLogin 的基本代码:

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

let params = {
    FunctionName: "main-@deploy_env@-users_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);
    }
});
Run Code Online (Sandbox Code Playgroud)