【问题标题】:Unable to fetch user information from AWS cognito using AWS Lambda service无法使用 AWS Lambda 服务从 AWS cognito 获取用户信息
【发布时间】:2020-12-25 23:39:32
【问题描述】:

这是我第一个用 JS 编写的 lambda。我正在尝试使用 lambda 函数从 AWS Cognito 获取用户信息。为此,我使用 AWS 提供的 Javascript SDK。我的代码如下

'use strict';

exports.handler = async (event) => {
    const AWS = require('aws-sdk');
    var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});
    var params = {
    AccessToken: 'my-access-token'
    };
    
    console.log('Getting info from cognito ${cognitoidentityserviceprovider}');
    cognitoidentityserviceprovider.getUser(params, function(err, data) {
    if (err) {
        console.log('In error stack of cognito call');
        console.log(err, err.stack); // an error occurred
        }
    else{
        console.log('In success stack of cognito call');
        console.log(data);           // successful response
        }
    });
    console.log('completed call from cognito');
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

我的函数日志如下

Function logs:
START RequestId: func-Id1 Version: $LATEST
2020-09-07T14:18:05.647Z    func-Id1    INFO    Start the lambda function
2020-09-07T14:18:10.531Z    func-Id1    INFO    Getting info from cognito ${cognitoidentityserviceprovider}
2020-09-07T14:18:10.893Z    func-Id1    INFO    completed call from cognito
END RequestId: func-Id1

现在,我面临的问题是我无法从 cognito 检索任何信息。我既没有收到成功响应,也没有收到错误消息。谁能建议我在我的 lambda 函数中缺少什么? TIA

【问题讨论】:

    标签: javascript amazon-web-services aws-lambda amazon-cognito


    【解决方案1】:

    我认为您的 Lambda 函数正在返回响应并在响应返回时执行 cognitoidentityserviceprovider.getUser() 函数的回调之前完成。

    cognitoidentityserviceprovider.getUser() 的调用是非阻塞的。换句话说,它不会等待回调执行,而是继续执行剩下的代码。

    根据您决定如何处理异步代码,您可以执行以下两种操作之一:

    使用异步/等待

    您的 Lambda 函数当前使用async 关键字,它希望您使用相应的await 关键字来处理异步请求,例如:

    try {
        const user = await cognitoidentityserviceprovider.getUser(params).promise();
        return {
            statusCode: 200,
            user: user
        };
    } catch(error) {
        return {
            statusCode: 500,
            error: error
        };
    }
    

    甚至只是:

    const AWS = require('aws-sdk');
    const cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18','us-east-1'});
    exports.handler = async (event) => {
        const params = {
            AccessToken: 'my-access-token'
        };
        return cognitoidentityserviceprovider.getUser(params).promise();
    };
    

    使用回调

    删除 async 关键字并在您的 Lambda 函数定义中再添加 2 个参数:

    exports.handler = (events, context, callback) => {
        ...
    }
    

    然后当您的cognitoidentityserviceprovider.getUser() 请求的回调返回时,使用 Lambda 的 callback 参数返回响应。

    cognitoidentityserviceprovider.getUser(params, (err, data) => {
        if (err) {
            console.log('In error stack of cognito call');
            done(err);
        } else {
            console.log('In success stack of cognito call');
            done(null, data);
        }
    });
    ... no need for a return statement ...
    

    欲了解更多信息see this page on handlers in the Lambda docs

    【讨论】:

      【解决方案2】:

      我认为你的 lambda 超时了。

      1. 将您的 SDK 初始化移到处理程序之外,这将大大加快您的冷启动时间(从大约 5 秒到不到 1 秒),因为它将在预配置的环境中使用 SDK。
      2. 增加您的 lambda 超时,看起来是 5 秒?
      3. 您尚未收到错误消息,但我认为您需要在 AWS 配置中设置一个区域。
      'use strict'; const AWS = require('aws-sdk'); var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18','us-east-1'});

      exports.handler = async (event) => {

      var params = {
      AccessToken: 'my-access-token'
      };
      
      console.log('Getting info from cognito ${cognitoidentityserviceprovider}');
      cognitoidentityserviceprovider.getUser(params, function(err, data) {
      if (err) {
          console.log('In error stack of cognito call');
          console.log(err, err.stack); // an error occurred
          }
      else{
          console.log('In success stack of cognito call');
          console.log(data);           // successful response
          }
      });
      console.log('completed call from cognito');
      
      const response = {
          statusCode: 200,
          body: JSON.stringify('Hello from Lambda!'),
      };
      return response;
      

      };

      对不起,我尝试过并尝试过的格式,但这段代码拒绝被标记!

      【讨论】:

        猜你喜欢
        • 2019-10-18
        • 2016-10-22
        • 2019-12-23
        • 1970-01-01
        • 2021-05-04
        • 2019-09-04
        • 2023-01-23
        • 2019-04-17
        • 2018-12-20
        相关资源
        最近更新 更多