Невозможно вызвать API-интерфейсы AWS Cognito из лямбда-AWS, но тот же код прекрасно работает в локальном node.js - PullRequest
0 голосов
/ 03 марта 2019

Это мой первый вопрос здесь :-)

Мне нужно перечислить пользователей в нашем пуле использования Cognito.Похоже, что это можно сделать только с помощью API CognitoIdentityServiceProvider aws-sdk.Я получил приведенный ниже код для идеальной работы из моего локального node.js.В нем перечислены все пользователи, как и ожидалось.

Однако один и тот же код ведет себя по-разному, если поместить его в лямбда-функцию AWS.Он все еще работает, но никогда не ждет возврата вызова Cognito listUsers ().Это просто завершается, как будто «жду» совсем не ждет.Ни один из console.log () не вызывается из блока client.listUsers (params, function (err, data) ..._).

Я проверял это внутри Lambda напрямую, а также из шлюза AWS API.Возвращается тот же ноль. Сам вызов выполнен успешно, просто данные не возвращаются. См. Журнал в конце.

Кстати, я создал роль и добавил политику, предоставляющую роли полный доступ для пользователя cognito.pool.

Что я пропустил? Ценим вашу помощь!

Martin 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();

*************** Лямбда-лог*****************

Log when called from Lambda

************** Журнал при вызове сnode.js ****************

Log when called from node.js

1 Ответ

0 голосов
/ 03 марта 2019

getUserList ваша лямбда-функция?Я не знаю, почему вы называете это самим собой getUserList().

Понятно, вы используете лямбда-среду выполнения, это версия nodejs> 8, вы используете ключевое слово await с функцией обратного вызова (сбой) => Ты ничего не жди.

Когда Lambda вызывает функцию, функция (асинхронная функция) завершится, когда получит возврат или выполнение до конца функции (без возврата), в вашем случае функция завершится, когда будет выполнено console.log("no waiting here. async!!!").В локальном окружении функция завершается, когда callstack очищен (нет функции обратного вызова в callstack).

Правильно, вы используете обещанную версию aws-sdk, а затем используйте синтаксис await дляполучить результат.Относитесь к Как использовать Async и Await с 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.
...