Использование групп пула пользователей Cognito для вызова лямбда-функции без федеративных удостоверений - PullRequest
0 голосов
/ 30 мая 2018

Я новичок и чувствую, что мне не хватает связи между ролью IAM в группе пользователей Cognito и вызовом лямбда-функции.

Вариант использования: я хотел бы использовать Cognito для управления моим пользователемучетные записи без федеративных удостоверений / пулов (мне не нужна федерация).Одной из особенностей Cognito является концепция групп: пользователи могут быть сегментированы на разные группы с разными связанными ролями IAM в одном пуле (т. Е. «Администраторы», «клиенты» и т. Д.).Через браузерное приложение и JavaScript (в S3) пользователи входят в систему и получают accessToken (также idToken и refreshToken).На данный момент все работает отлично.

Моя проблема в том, что я хочу вызывать функции, используя 'lambda.invoke' для разных вещей (например, чтение-запись в DynamoDB), и надеялся избежать дополнительного шага использования шлюза API..

Из browser-invoke-lambda-function-example Я могу видеть, как это сделать, используя 'AWS.CognitoIdentityCredentials', но из того, что я могу сказать, для этого требуются федеративные удостоверения.

Документация класса Lambda также описывает, как использовать IAM accessKeyId и secretAccessKey, но я хочу вызывать функции Lambda, используя учетные данные пользователя, вошедшего в систему, из пула / группы пользователей Cognito -> Role.

Если быть точным - Буду признателен, если кто-нибудь посоветует, можно ли использовать lambda.invoke из браузера JavaScript, используя только пулы пользователей и группы пользователей (учитывая, чтороль IAM, связанная с группой пользователей) ?

Если это возможно, пожалуйста, предоставьте некоторый пример кода или направление, котороеПрежде чем я мог бы узнать, как.

PS: я понимаю, что подобные вопросы были заданы ранее (т. е. Можно ли вызвать функцию Lambda с идентификатором cognito userpool?) но вопросы были тонкими по деталям, поэтому ответы были столь же расплывчатыми.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Следующее работает, если вы включаете «Пулы федеративных удостоверений», используете только «Поставщик Cognito» (поскольку федеративные удостоверения не требуются), а в разделе «Выбор роли аутентификации» вы выбираете «Выбрать роль из токена» и«Разрешение роли» DENY.

function test() { // eslint-disable-line no-unused-vars
    // Prepare to call Lambda function
    let pullResults;

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: <<IdentityPoolId>>,
      Logins: {
        "cognito-idp.<<REGION>>.amazonaws.com/<<USER POOL ID>>": <<idToken>>,
      },
    });

    const lambda = new AWS.Lambda({
      apiVersion: "2015-03-31",
    });

    const pullParams = {
      FunctionName: "<<Lambda Function Name>>",
      InvocationType: "RequestResponse",
      LogType: "None",
    };

    // Call the Lambda Function
    lambda.invoke(pullParams, function (err, data) {
      if (err) {
        console.log(err);
      } else {
        pullResults = JSON.parse(data.Payload);
        console.log(pullResults);
      }
    });
  }

Хотя при этом создается федеративный идентификатор, он не использует ничего, кроме поставщика Cognito, и получает роль IAM от группы, к которой принадлежит пользователь.

Эффективно: использование пользователей Cognito из пулов пользователей и назначение разрешений на основе группы пользователей, которой назначен пользователь.

0 голосов
/ 30 мая 2018

Я звоню в Lambda из JavaScript на стороне браузера.Если я правильно помню, вам нужно создать роль IAM, которая позволит вашему пользователю получать доступ к лямбде.Прекрасно работает так:

var lambda = new AWS.Lambda();

var params_lambda = {
  FunctionName: 'your_function_name',
  Payload: JSON.stringify(userPool.getCurrentUser().username) // data you want to send to lambda
};


lambda.invoke(params_lambda, function (err, data) {
  if (err) {
    console.log(err);
    window.location.href = "login.html";
  }
  else{
    console.log(JSON.parse(data.Payload)); // print out data you receive from lambda
  }
});

экземпляр var lambda = new AWS.Lambda(); нуждается

accessKeyId,

sessionToken

и

регион

...