无法使用AWS Lambda服务从AWS Cognito提取用户信息

问题描述

这是我用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

解决方法

我认为您的lambda超时了。

  1. 将SDK初始化移到处理程序之外,这将大大缩短冷启动时间(从大约5s到不到一秒钟),因为它将在预配置的环境中使用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;

var params = { AccessToken: 'my-access-token' }; console.log('Getting info from cognito ${cognitoidentityserviceprovider}'); cognitoidentityserviceprovider.getUser(params,}; return response;

很抱歉,我尝试了多次格式化,但是此代码拒绝被标记!

,

我认为您的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) => {
    ...
}

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

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