#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
должен быть обязательным. Вероятно, существующая политика на основе ресурсов была сгенерирована путем выбора функции в качестве триггера на странице триггера пользовательского пула. Я только что вставил новый стек, и он не был включен. Затем я изменил триггер на «Нет», сохранил, затем изменил его обратно на лямбда-функцию, и эта лямбда-функция автоматически получила политику на основе ресурсов, позволяющую пулу пользователей инициировать ее.