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

Созданный на 11 сент. 2018  ·  10Комментарии  ·  Источник: serverless/serverless

Это (Отчет об ошибке)

Описание

Для отчетов об ошибках:
когнито-пользователь-пул.yml

Resources:
  CognitoUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      # Generate a name based on the stage
      UserPoolName: ${self:provider.stage}MyUserPool

serverless.yml

functions:
  preSignUp:
    handler: presignup.handler
    events:
      - cognitoUserPool:
          pool: ${self:provider.stage}MyUserPool
          trigger: PreSignUp

resources:
  - ${file(resources/cognito-user-pool.yml)}

В результате создаются два UserPools с тем же именем и один с присоединенной функцией триггера, другой с присоединенными политиками и другими вещами, которые я определяю в когнитивном пуле пользователей.

Похожие или зависимые вопросы:

  • # 4207

Дополнительная информация

"serverless": "1.30.3"

bug caaws-event-cognito

Самый полезный комментарий

Ваше решение сработало как шарм @robotlemons !! 🎉 Большое спасибо, что поделились этим!

Что действительно сбивало меня с толку, так это то, что документы все время вызывают CognitoUserPool как MyUserPool , а я устанавливал UserPoolName: ${self:provider.stage}-user-pool , поэтому я подумал, что при объявлении лямбда , мы должны делать:

- cognitoUserPool:
  pool: ${self:provider.stage}-user-pool
  trigger: PostConfirmation

Я думал, что таким образом я установил одно и то же имя для обоих, но ключ здесь состоит в том, чтобы присвоить атрибуту pool то же значение, что и вашему CognitoUserPool, поэтому в документации он установлен как MyUserPool .

Итак, я наконец только что объявил свой пул пользователей в cognito-user-pool.yml как:

Resources:
  CognitoUserPoolMyUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: ${self:provider.stage}-user-pool

А в serverless.yml лямбда объявлена ​​как:

  postConfirmation:
    handler: src/cognito/postConfirmation.handler
    events:
      - cognitoUserPool:
          pool: MyUserPool  // Notice that this one is the declared name of my pool CognitoUserPoolMyUserPool but without the CognitoUserPool part.
          trigger: PostConfirmation

Надеюсь, это поможет кому-то еще в будущем!

Еще раз большое спасибо за вашу помощь! 💯

Все 10 Комментарий

Имея ту же проблему. Интересно, когда можно будет достичь разрешения?

У меня тоже есть эта проблема, и я не могу ее решить, следуя примерам в документации или другим закрытым вопросам.

@ Ccastillo06 Я смог исправить проблему, сделав это ... (выделенные жирным шрифтом части - важная часть. Это сработало для меня даже после того, как у меня возникли все проблемы.

CognitoUserPoolMyUserPool:
Тип: AWS :: Cognito :: UserPool
Свойства:
UserPoolName: mypool _ $ { self: provider.stage } _auth_pool
Атрибуты имени пользователя:
- Эл. адрес
Схема:
- Имя: given_name
AttributeDataType: String
Мутабельный: правда
Обязательно: true
- Имя: family_name
AttributeDataType: String
Мутабельный: правда
Обязательно: true
- Имя: электронная почта
AttributeDataType: String
Изменяемый: ложь
Обязательно: true
- Имя: phone_number
AttributeDataType: String
Мутабельный: правда
Обязательно: true
AutoVerifiedAttributes:
- Эл. адрес

postConfirmation:
обработчик: ..
объем памяти: ...
События:
- http:
путь: ...
метод: положить
интеграция: лямбда
корс: правда
авторизатор:
тип: COGNITO_USER_POOLS
authorizerId:
Ссылка: ApiGatewayAuthorizer
- cognitoUserPool:пул: MyUserPoolтриггер: PostConfirmation

Ваше решение сработало как шарм @robotlemons !! 🎉 Большое спасибо, что поделились этим!

Что действительно сбивало меня с толку, так это то, что документы все время вызывают CognitoUserPool как MyUserPool , а я устанавливал UserPoolName: ${self:provider.stage}-user-pool , поэтому я подумал, что при объявлении лямбда , мы должны делать:

- cognitoUserPool:
  pool: ${self:provider.stage}-user-pool
  trigger: PostConfirmation

Я думал, что таким образом я установил одно и то же имя для обоих, но ключ здесь состоит в том, чтобы присвоить атрибуту pool то же значение, что и вашему CognitoUserPool, поэтому в документации он установлен как MyUserPool .

Итак, я наконец только что объявил свой пул пользователей в cognito-user-pool.yml как:

Resources:
  CognitoUserPoolMyUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: ${self:provider.stage}-user-pool

А в serverless.yml лямбда объявлена ​​как:

  postConfirmation:
    handler: src/cognito/postConfirmation.handler
    events:
      - cognitoUserPool:
          pool: MyUserPool  // Notice that this one is the declared name of my pool CognitoUserPoolMyUserPool but without the CognitoUserPool part.
          trigger: PostConfirmation

Надеюсь, это поможет кому-то еще в будущем!

Еще раз большое спасибо за вашу помощь! 💯

@ Ccastillo06
Извините, я очень запутался и хотел бы получить помощь.

Итак, в объявлении PostConfirmation в разделе событий cognitoUserPool. Каким должно быть значение «пул»? Я пробовал настоящее имя пользовательского пула, и он продолжает создавать новые пользовательские пулы. Я также пробовал значение прямо в разделе «Ресурсы» (в вашем случае «CognitoUserPoolMyUserPool»).

Теперь в вашем значении «пул» вы сказали, что вводите «MyUserPool» без части CognitoUserPool, но мое имя ресурса другое. Так как меня зовут? Я пробовал использовать полное имя, но это не сработало.

@ Studio2133

Resources:
  CognitoUserPoolMyUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: ${self:provider.stage}-user-pool

В этом примере вы должны использовать все, что находится после CognitoUserPool, в качестве значения пула. В этом случае это будет MyUserPool

@robotlemons Спасибо за оперативный ответ!

Поэтому я должен переименовать свой ресурс. В настоящее время у меня его нет, начиная с CognitoUserPool. В настоящее время он называется просто MycompanyUserPool. Я поменяю его на: CognitoUserPoolMyCompanyUserPool ... Это правильно?

да

отправлено из моего Айфона

11 апреля 2019 г. в 12:33 Studio2133 [email protected] написал:

@robotlemons Спасибо за оперативный ответ!

Поэтому я должен переименовать свой ресурс. В настоящее время у меня его нет, начиная с CognitoUserPool. В настоящее время он называется просто MycompanyUserPool. Я поменяю его на: CognitoUserPoolMyCompanyUserPool ... Это правильно?

-
Вы получаете это, потому что вас упомянули.
Ответьте на это письмо напрямую, просмотрите его на GitHub или отключите обсуждение.

@ Studio2133 В вашем случае вы должны сделать то, что сказал @robotlemons , просто добавьте CognitoUserPool перед именем вашего фактического пользовательского пула MycompanyUserPool .

Итак, в итоге у вас должно быть: CognitoUserPoolMycompanyUserPool для этого имени пула.

Итак, определение вашего пула пользователей в cognito-user-pool.yml должно быть:

Resources:
  CognitoUserPoolMycompanyUserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      UserPoolName: ${self:provider.stage}-user-pool

И тогда определение лямбда-триггера в serverless.yml должно быть:

 postConfirmation:
    handler: src/cognito/postConfirmation.handler
    events:
      - cognitoUserPool:
          pool: MycompanyUserPool  
          trigger: PostConfirmation

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

Не забудьте удалить каждый дублированный пул перед созданием фиксированных пулов, чтобы в панели управления AWS не было ничего запутанного.

Надеюсь, это полезно и решит проблему!

@ Studio2133
Когда вы добавляете событиеognitoUserPool в лямбда-выражение, Serverless автоматически создает новый пул пользователей Cognito и добавляет его в созданный вами шаблон CloudFormation. Имя логического ресурса CloudFormation для этого пула - CognitoUserPool {normalizedPoolId}, где normalizedPoolId - это имя, которое вы указываете для пула в событииognitoUserPool. Это пул, к которому будет подключен триггер. Чтобы подключить триггер к вашему собственному пулу, который вы объявляете в Ресурсах, вы можете воспользоваться этим соглашением об именовании, чтобы переопределить пул, созданный путем добавления события cognitoUserPool. Для этого вам необходимо использовать CognitoUserPool {normalizedPoolId} в качестве логического имени ресурса вашего пула в разделе ресурсов. Это приведет к тому, что Serverless будет использовать этот пул для подключения вашего триггера вместо создания нового.

Подробнее об этом подходе можно прочитать в этой статье.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги