Безсерверные дубликаты пользовательских пулов вместо повторного использования по имени
Я использую бессерверный сервер для развертывания шаблона AWS CloudFormation и некоторых функций, вот часть моего файла serverless.yml:
resources:
Resources:
MyUserPool: #An inline comment
Type: "AWS::Cognito::UserPool"
Properties:
UserPoolName: "MyUserPool"
Policies:
PasswordPolicy:
MinimumLength: 7
RequireLowercase: false
RequireNumbers: true
RequireSymbols: false
RequireUppercase: false
functions:
preSignUp:
handler: presignup.validate
events:
- cognitoUserPool:
pool: "MyUserPool"
trigger: PreSignUp
Как видите, оба имени пула пользователей совпадают, но когда я запускаю развертывание без сервера, создаются 2 пула пользователей с одинаковыми именами.
Это ошибка или я что-то упустил?
1 ответ
Сначала я обнаружил, что это нелогично и запутанно. Однако на самом деле это ожидаемое (и задокументированное) поведение.
Когда вы присоединяете событие Cognito к функции в качестве триггера, Serverless создаст для вас пул пользователей даже без запроса. Источник:
Это создаст пул пользователей Cognito с указанным именем.
Так что в вашем случае один пул пользователей создается cognitoUserPool
событие, а другой создается вашим Resources
раздел. Тот, созданный Resources
является правильным (имеет настраиваемую политику паролей), а созданный лямбда-триггером имеет конфигурацию по умолчанию. Исправление описано под заголовком "Переопределение созданного пула пользователей".
Вы префикс ключа пула пользователей в разделе ресурсов с CognitoUserPool
Это приведет к тому, что и ваш триггер, и ваш ресурс будут ссылаться на один и тот же пул пользователей в сгенерированном шаблоне CloudFormation.
В вашем случае это означает просто изменить это:
resources:
Resources:
MyUserPool:
Type: "AWS::Cognito::UserPool"
к этому:
resources:
Resources:
CognitoUserPoolMyUserPool:
Type: "AWS::Cognito::UserPool"
Протестировано с Serverless 1.26.0
Правильный способ сделать это - установить existing: true
на ваших функциях свойства cognitoUserPool вроде так...
createAuthChallenge:
handler: services/auth/createAuthChallenge.handler
events:
- cognitoUserPool:
pool: ${self:custom.stage}-user-pool
trigger: CreateAuthChallenge
existing: true
Бессерверная поддержка была добавлена в июле 2019 года.