无法从AWS lambda调用AWS Cognito API,但是相同的代码在本地node.js中运行良好

时间:2019-03-03 03:10:19

标签: asynchronous async-await aws-lambda aws-sdk amazon-cognito

这是我在这里的第一个问题:-)

我需要在我们的Cognito使用池中列出用户。似乎只能使用aws-sdk CognitoIdentityServiceProvider API来完成此操作。我从本地node.js获得以下代码以使其完美运行。它按预期列出了所有用户。

但是,将相同的代码放入AWS lambda函数时,其行为会有所不同。它仍然运行,但是它从未等待Cognito listUsers()调用返回。它只是简单地完成,就像“等待”根本没有等待一样。不会从client.listUsers(params,function(err,data)..._ block)调用console.log()。

我直接在Lambda内部以及从AWS API网关进行了测试。返回相同的null。调用本身成功,仅不返回任何数据。      请参阅最后的日志。

顺便说一句,我确实创建了一个角色,并添加了一个策略,使该角色可以完全访问cognito用户池。

我想念什么?感谢您的帮助!

马丁C。

----------------- code ------------------------

async function getUserList() {
    console.log("enter LAMDA function**********");
    var aws = require('aws-sdk');
    aws.config.update({accessKeyId: 'xxxxxxxx', secretAccessKey: 'xxxxxxxxxxx'});
    var CognitoIdentityServiceProvider = aws.CognitoIdentityServiceProvider;
    var client = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: 'us-east-2' });

    var params = {
         UserPoolId: 'us-east-xxxxxxxx', /* required */
          AttributesToGet: [
          'given_name','family_name','phone_number','email','profile'
        ],
        Filter: null,
        Limit: 0,
        PaginationToken: null
    };
    console.log("Right before call the listUser method");

    let result = await client.listUsers(params, function(err, data) {
     console.log("call back reached!");
     if (err) { 
              console.log(err, err.stack); // an error occurred
              const response = {
              statusCode: 500,
              body: JSON.stringify('An error occurred.'),
        }
        return response;
     }
     else  {
         console.log(data);   
         var count = data.Users.length;
             // successful response
             const response = {
             statusCode: 200,
             body: JSON.stringify("sucessful list users! User count="+count)
          }
          return response;
     }
    });

    console.log("no waiting here. async!!!")
}

getUserList();

*************** Lambda日志*****************

Log when called from Lambda

**************从node.js调用时记录日志****************

Log when called from node.js

1 个答案:

答案 0 :(得分:0)

getUserList是您的lambda函数吗?我不知道您为什么自己getUserList()称呼它。

我知道,您使用的lambda运行时是nodejs版本> 8,您将await关键字与回调函数一起使用(失败)=>您什么都没有等待。

当Lambda调用函数时,该函数(异步函数)将在返回或运行到函数末尾(无返回)时结束,在您的情况下,该函数在执行console.log("no waiting here. async!!!")后结束。在本地环境中,功能已清除callstack(在调用堆栈中没有任何回调函数)后结束。

正确的方法是,使用aws-sdk的Promise版本,然后使用await语法获得结果。与How to use Async and Await with AWS SDK Javascript

相关
async function getUserList() {
    console.log("enter LAMDA function**********");
    var aws = require('aws-sdk');
    aws.config.update({ accessKeyId: 'xxxxxxxx', secretAccessKey: 'xxxxxxxxxxx' });
    var CognitoIdentityServiceProvider = aws.CognitoIdentityServiceProvider;
    var client = new CognitoIdentityServiceProvider({ apiVersion: '2016-04-19', region: 'us-east-2' });

    var params = {
        UserPoolId: 'us-east-xxxxxxxx', /* required */
        AttributesToGet: [
            'given_name', 'family_name', 'phone_number', 'email', 'profile'
        ],
        Filter: null,
        Limit: 0,
        PaginationToken: null
    };
    console.log("Right before call the listUser method");

    try {
        let result = await client.listUsers(params).promise(); // use Promise style
        console.log(data);
        var count = data.Users.length;
        // successful response
        const response = {
            statusCode: 200,
            body: JSON.stringify("sucessful list users! User count=" + count)
        }
        return response; // return to finish function
    } catch (err) {
        console.log(err, err.stack); // an error occurred
        const response = {
            statusCode: 500,
            body: JSON.stringify('An error occurred.'),
        }
        return response;
    }
}

getUserList(); // remove this line when deploy funtion to Lambda.