【问题标题】:Cognito returns UnexpectedLambdaException timeout error while invoking Lambda functionCognito 在调用 Lambda 函数时返回 UnexpectedLambdaException 超时错误
【发布时间】:2017-08-29 14:21:44
【问题描述】:

我第一次登录我的应用程序时,早上的第一件事,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
}

第二次,之后的每一天,一切都很好。

当我在 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  

之后的每次,在一天的剩余时间里,我都没有看到这个错误。我的 Lambda 设置为 30 秒后超时,但我知道 Cognito needs a response in 5 seconds

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

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

这里有人有解决方案吗?我被难住了。

【问题讨论】:

    标签: amazon-web-services lambda sequelize.js amazon-cognito


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我通过创建 2 个 Lambda 解决了这个问题:onLoginactualOnLoginonLogin Lambda 只是异步启动 actualOnLogin Lambda 并立即返回。 actualOnLogin 更新我的数据库。这样onLogin

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

      【讨论】:

      • 我无法让它工作;收到“无法识别的 lambda 输出”错误。有什么建议吗?
      • 您是从 Cognito 还是 Lambda 收到的?你的 Lambda 的日志说什么?也许他们找不到actualOnLogin Lambda?
      • 感谢您的跟进。我让它工作了。在 Lambda 函数 (JavaScript) 中,我在 exports.handler 中声明了 callback 参数,但最后我没有像 callback(null, event) 那样调用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      相关资源
      最近更新 更多