Пользовательский пул Cognito не вызывает лямбда-функцию

#aws-lambda #amazon-cloudformation #amazon-cognito

#aws-lambda #amazon-cloudformation #amazon-cognito

Вопрос:

Я создаю пользовательский пул Cognito с помощью Cloudformation и устанавливаю LambdaConfig -> Предварительную аутентификацию для функции Lambda, также созданной с помощью Cloudformation. Проблема в том, что лямбда-функция, похоже, не вызывается. При аутентификации пользователь входит в систему без вмешательства логики предварительной аутентификации, а журналы Cloudwatch для лямбда-функции пусты. Если я протестирую функцию на панели управления Lambda, она будет работать правильно. Я не получаю никаких ошибок.

Кроме того, я моделирую эту настройку Cloudformation на существующей настройке, которая работает. И ресурсы, полученные из стека Cloudformation, похоже, имеют ту же конфигурацию, что и рабочая версия.

Соответствующие части шаблона cloudformation выглядят следующим образом:

   UserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      LambdaConfig:
        PreAuthentication: !GetAtt UserAuthorizerFunction.Arn
      UsernameAttributes:
        - email
      UsernameConfiguration:
        CaseSensitive: false
 

Лямбда-функция определяется как:

   UserAuthorizerFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: Authorize_Users
      Description: Authorizes users
      Handler: index.handler
      Role: !GetAtt AuthorizerFunctionRole.Arn
      Code:
        ZipFile: |
          const AWS = require('aws-sdk')
          // stuff
      Runtime: nodejs12.x
 

Лямбда-функция создается с помощью политики, основанной на ресурсах, которая выглядит корректно:

 {
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "AuthorizerFunctionPermission-WSIGC4MBBT0C",
      "Effect": "Allow",
      "Principal": {
        "Service": "cognito-idp.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:<redacted>:function:Authorize_Users",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:cognito-idp:us-east-1:<redacted>:userpool/us-east-1_<redacted>"
        }
      }
    }
  ]
}
 

Почему не выполняется мой хук предварительной аутентификации? Есть ли DependsOn требование, о котором я не думаю?

Комментарии:

1. Вы уверены, что разрешения указаны правильно? Функция arn предлагает имя Authorize_Users , но у вашей функции есть имя ${StackName}_Authorize_Users ? Также как вы создали эти разрешения? Для них не отображается код CFN.

2. Спасибо тебе, Марчин. Моя ошибка в имени функции / arn. Когда я создавал вопрос выше, я немного упростил ситуацию. Имя функции и ARN в политике, основанной на ресурсах, действительно совпадают. Я обновил вопрос выше, чтобы показать это. re: код CFN и разрешения на создание — я не уверен, что вы имеете в виду. Похоже, что политика на основе ресурсов создается автоматически, потому что я использую функцию в качестве триггера cognito.

3. Я бы согласился, что, скорее всего, это будут разрешения. У меня нет опыта работы с Cognito, но с API Gateway вы можете получить аналогичное поведение, когда у службы нет прав на вызов лямбда-выражения. Последний ресурс, похоже, предоставляет соответствующий доступ, хотя я привык рассматривать это как AWS::Lambda::Permission ресурс, а не как политику. Странно, что это JSON, а остальные биты — YAML, они в отдельных шаблонах? Если да, то не имеет ли пользовательский пул доступа к лямбде на момент его создания? В этом может быть проблема… кажется, это о чем-то говорит.

4. Спасибо, что посмотрели на это 404. JSON, который вы видите, был получен со страницы консоли Lambda на вкладке «Разрешения». Таким образом, он отделен от шаблона Cloudformation yaml. JSON фактически является частью результата создания стека cloudformation с помощью yaml.

Ответ №1:

Оказалось, что это известная проблема — по крайней мере, другие испытывают ее: https://forums.aws.amazon.com/thread.jspa?messageID=897845amp;#897845

Мне нужно было удалить параметр ALLOW_CUSTOM_AUTH auth flow и использовать ALLOW_USER_PASSWORD_AUTH .

Комментарии:

1. Также — @404 был прав, полагая, что a AWS::Lamda::Permission должен быть обязательным. Вероятно, существующая политика на основе ресурсов была сгенерирована путем выбора функции в качестве триггера на странице триггера пользовательского пула. Я только что вставил новый стек, и он не был включен. Затем я изменил триггер на «Нет», сохранил, затем изменил его обратно на лямбда-функцию, и эта лямбда-функция автоматически получила политику на основе ресурсов, позволяющую пулу пользователей инициировать ее.