Когда я пытаюсь войти в систему с помощью AWS Cognito, я получаю исключение AccessDeniedException о моем пользовательском триггере Lambda.

Я вызываю adminInitiateAuth и получаю странное исключение AccessDeniedException для своих лямбда-выражений.

Вот код, который я звоню:

      var params = {
        AuthFlow: "ADMIN_NO_SRP_AUTH",
        ClientId: "@cognito_client_id@",
        UserPoolId: "@cognito_pool_id@",
        AuthParameters: {
          USERNAME : username,
          PASSWORD : tempPassword
        },
      };
      cognitoIdentityServiceProvider.adminInitiateAuth(params, function(error, data) {
        if (error) {
          console.log("ERROR! Login failed: " + JSON.stringify(error), error.stack);
        } else {
          console.log("Login sent back: " + JSON.stringify(data));
        }
      });

Я получаю следующее сообщение об ошибке:

ERROR! Login failed: {"message":"arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.","code":"UnexpectedLambdaException","time":"2017-02-25T18:54:15.109Z","requestId":"ce42833f-fb8b-11e6-929b-2f78b63faa12","statusCode":400,"retryable":false,"retryDelay":1.0853444458916783} UnexpectedLambdaException: arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.

Кто-нибудь знает, почему я могу получить эту ошибку?


person Ryan Shillington    schedule 25.02.2017    source источник


Ответы (5)


Это произошло потому, что я воссоздал свой API-шлюз и лямбда-выражения (без сервера), и оказалось, что консоль Cognito незаметно добавляет разрешения для связи с заданной функцией Lambda при добавлении в качестве триггера через консоль.


Чтобы исправить это в файле CloudFormation / serverless.yml:

resources:
  Resources:
    OnCognitoSignupPermission:
      Type: 'AWS::Lambda::Permission'
      Properties:
        Action: "lambda:InvokeFunction"
        FunctionName:
          Fn::GetAtt: [ "UsersUnderscoreonCognitoSignupLambdaFunction", "Arn"]
        Principal: "cognito-idp.amazonaws.com"
        SourceArn:
          Fn::Join: [ "", [ "arn:aws:cognito-idp", ":", Ref: "AWS::Region", ":", Ref: "AWS::AccountId", ":", "userpool/", "@cognito_pool_id@" ] ]

Чтобы исправить это в консоли AWS:

  • Перейдите в консоль Cognito
  • Выберите свой пул пользователей
  • Перейти в «Триггеры»
  • Удалите пользовательский триггер (установите для него значение «Нет») и нажмите «Сохранить».
  • Теперь сбросьте его и снова нажмите «Сохранить».

Вот интересное сообщение на форуме Amazon, которое привело меня по правильному пути .

person Ryan Shillington    schedule 25.02.2017
comment
Вы, добрый сэр, спасли мне сегодня рассудок! Сделал то же самое (то есть без сервера), и это исправило. - person Adam B; 15.10.2018
comment
Это безумие. Кроме того, функция обнаружения дрейфа для шаблонов облачных образований не видит никакой разницы после повторного сохранения триггера. - person Ciryon; 04.12.2018
comment
Я обновил свой ответ, включив в него изменения, которые мы внесли, чтобы он работал в CloudFormation. Престижность ответу @ shanewwarren ниже (хотя, честно говоря, мы выяснили это за несколько месяцев до того, как он опубликовал свой ответ). - person Ryan Shillington; 05.12.2018
comment
Я согласен с @Ciryon, это безумие, и AWS явно ненавидит своих клиентов. - person Randy L; 25.04.2019
comment
Если кто-то еще настраивает Cognito с помощью Terraform, есть открытый вопрос, связанный с лямбда-разрешения. - person Randy L; 25.04.2019
comment
@ the0ther Мне интересно, сканирует ли AWS Stack Overflow с помощью анализа настроений и собирает ли комментарии, подобные нашим. :) - person Ciryon; 07.05.2019
comment
Привет всем, я получаю эту ошибку после развертывания облачной формации с помощью ampify-cli, я пытался добавить такого рода разрешения во все виды мест и во многих других форматах, они никогда не были развернуты. Кто-нибудь знает, в каком шаблоне формирования облака и где именно должно быть размещено это разрешение для успешного развертывания? - person David Ben Ari; 30.08.2019
comment
Хотя мое решение было другим, тем не менее, ты такой спаситель! - person snehanshu.js; 02.05.2020
comment
Сэр, если бы я мог проголосовать за этот ответ дважды, я бы это сделал. Наткнулся на ту же проблему через год после того, как проголосовал за нее, и вот я здесь, еще раз выражаю вам свою признательность. еще раз большое спасибо! - person fmquaglia; 16.07.2021

У меня была проблема, аналогичная вашей, за исключением того, что я пытался настроить Lambda с моим пулом пользователей Cognito через CloudFormation.

В ссылке, которую опубликовал Райан, был опубликованный кем-то образец кода. А именно Cognito требовались соответствующие разрешения для вызова лямбда-функции.

MyLambdaInvocationPermission:
  Type: AWS::Lambda::Permission
  Properties:
    Action: lambda:InvokeFunction
    FunctionName: !GetAtt MyLambdaFunctionName.Arn
    Principal: cognito-idp.amazonaws.com
    SourceArn: !GetAtt MyCognitoUserPoolName.Arn
person shanewwarren    schedule 28.12.2017
comment
Спасибо, спасли мне день! - person Nirojan Selvanathan; 07.08.2018
comment
Спасибо, этого не хватало. - person wascou; 16.08.2018
comment
Работал как шарм, ... Спасибо - person Prince Antony P; 23.11.2018
comment
Да, мне потребовалось время, чтобы прийти к такому же выводу. Просто добавьте разрешение под Resources. Я установил SourceArn на arn:aws:cognito-idp:<your region>:<your account>:userpool/*, чтобы предоставить доступ ко всем нашим пулам. - person DenisH; 05.12.2018
comment
Привет всем, я получаю эту ошибку после развертывания облачной формации с помощью ampify-cli, я пытался добавить такого рода разрешения во все виды мест и во многих других форматах, они никогда не были развернуты. Кто-нибудь знает, в каком шаблоне формирования облака и где именно должно быть размещено это разрешение для успешного развертывания? - person David Ben Ari; 30.08.2019
comment
Вы, сэр, не что иное, как ge nee uss. Просто чтобы добавить, я использовал FunctionName: my-function-name без .Arn - person C.K Munn; 17.10.2019
comment
Все еще актуально. Документация по триггерам Cognito действительно сбивает с толку. Благодарность! - person badfun; 10.09.2020

Для тех, кто попадает сюда и пытается добавить триггеры когнитивных функций через terraform, все, что вам нужно сделать, это добавить ресурс aws_lambda_permission:

resource "aws_lambda_permission" "allow_execution_from_user_pool" {
  statement_id = "AllowExecutionFromUserPool"
  action = "lambda:InvokeFunction"
  function_name = aws_lambda_function.<lambda>.function_name
  principal = "cognito-idp.amazonaws.com"
  source_arn = aws_cognito_user_pool.<pool>.arn
}

Найдено в этом замечательном сообщении: https://www.integralist.co.uk/posts/cognito/

person M.R.    schedule 29.06.2020

вы можете добавить разрешение из лямбда-роли (создать политику для когнитивного анализа и добавить к этой лямбда-роли). это решит мою проблему, когда я застрял в ней

person satej sarker    schedule 07.08.2019

при создании стека облачной информации возникла ошибка типа

User:arn:aws::12345678:user/xyz is not authorized to perform:
cognito-idp:CreateUserPool on resource:*(Service:AWSCognitoIdentityProviderService;
Status Code: 400; Error Code: AccessDeniedException;Request ID: xxxxx)

обходной путь:

  • перешел к стеку, который находится в состоянии отката -> проверенные события, и смог увидеть (не удалось создать) некоторые роли, к которым у меня нет доступа,
  • Итак, я проверил назначенную мне IAM-политику - у меня не было доступа.
  • Я создал новую политику и назначил себе встроенную политику, импортировав ее из AWS.
    # P1 #
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Cognito-IDP",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "cognito-idp:*"
            ],
            "Resource": "*"
        }
    ]
}

примечание: вы можете ограничить доступ к ресурсу и пользователю когнито-idp.

с этим - я успешно могу создать и развернуть стек облачной информации для модуля.

person DHEERAJ    schedule 26.12.2019
comment
Эта ошибка совершенно не связана с OP - она ​​указывает на то, что пользователь, использующий облачную информацию, не имеет доступа для создания пула пользователей Cognito. - person Emil Styrke; 10.06.2021