Безсерверные дубликаты пользовательских пулов вместо повторного использования по имени

Я использую бессерверный сервер для развертывания шаблона 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 года.

Другие вопросы по тегам