Serverless: Création du pool d'utilisateurs Cognito dupliqué lorsque la ressource et la fonction sont définies avec le même nom

Créé le 11 sept. 2018  ·  10Commentaires  ·  Source: serverless/serverless

Ceci est un (rapport de bogue)

La description

Pour les rapports de bogue:
cognito-user-pool.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)}

Il finit par créer deux UserPools avec le même nom et un avec une fonction de déclenchement attachée, l'autre avec des politiques attachées et d'autres choses que je définis dans cognito-user-pool

Problèmes similaires ou dépendants:

  • # 4207

Donnée supplémentaire

"sans serveur": "1.30.3"

bug caaws-event-cognito

Commentaire le plus utile

Votre solution a fonctionné comme un charme @robotlemons !! 🎉 Merci beaucoup de l'avoir partagé!

La partie qui était vraiment déroutante pour moi était que les documents appellent le CognitoUserPool comme MyUserPool tout le temps, et je définissais UserPoolName: ${self:provider.stage}-user-pool , alors j'ai pensé que lors de la déclaration du lambda , nous devrions faire:

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

Je pensais que de cette façon, je définissais le même nom pour les deux, mais la clé ici est de donner à l'attribut pool la même valeur que votre CognitoUserPool, d'où la raison pour laquelle la documentation le définit comme MyUserPool .

Je viens donc de déclarer mon pool d'utilisateurs dans cognito-user-pool.yml comme:

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

Et dans serverless.yml le lambda est déclaré comme:

  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

J'espère que cela aidera quelqu'un d'autre à l'avenir!

Un grand merci encore pour votre aide! 💯

Tous les 10 commentaires

Avoir le même problème. Curieux de savoir quand une résolution peut être trouvée?

J'ai également ce problème et je ne parviens pas à le résoudre en suivant les exemples dans la documentation ou d'autres problèmes fermés

@ Ccastillo06 J'ai pu corriger le problème en le faisant ... (les parties en gras sont la pièce importante. Cela a fonctionné pour moi même après avoir rencontré tous les problèmes.

CognitoUserPoolMyUserPool:
Type: AWS :: Cognito :: UserPool
Propriétés:
UserPoolName: mypool _ $ { self: provider.stage } _auth_pool
Nom d'utilisateur
- email
Schéma:
- Nom: nom_donné
AttributeDataType: Chaîne
Mutable: vrai
Obligatoire: vrai
- Nom: nom_famille
AttributeDataType: Chaîne
Mutable: vrai
Obligatoire: vrai
- Nom: email
AttributeDataType: Chaîne
Mutable: faux
Obligatoire: vrai
- Nom: phone_number
AttributeDataType: Chaîne
Mutable: vrai
Obligatoire: vrai
Attributs AutoVerified:
- email

postConfirmation:
gestionnaire: ..
taille mémoire: ...
événements:
- http:
chemin: ...
méthode: mettre
intégration: lambda
cors: vrai
autorisateur:
type: COGNITO_USER_POOLS
authorizerId:
Réf: ApiGatewayAuthorizer
- cognitoUserPool:pool: MyUserPooldéclencheur: PostConfirmation

Votre solution a fonctionné comme un charme @robotlemons !! 🎉 Merci beaucoup de l'avoir partagé!

La partie qui était vraiment déroutante pour moi était que les documents appellent le CognitoUserPool comme MyUserPool tout le temps, et je définissais UserPoolName: ${self:provider.stage}-user-pool , alors j'ai pensé que lors de la déclaration du lambda , nous devrions faire:

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

Je pensais que de cette façon, je définissais le même nom pour les deux, mais la clé ici est de donner à l'attribut pool la même valeur que votre CognitoUserPool, d'où la raison pour laquelle la documentation le définit comme MyUserPool .

Je viens donc de déclarer mon pool d'utilisateurs dans cognito-user-pool.yml comme:

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

Et dans serverless.yml le lambda est déclaré comme:

  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

J'espère que cela aidera quelqu'un d'autre à l'avenir!

Un grand merci encore pour votre aide! 💯

@ Ccastillo06
Je suis désolé, je suis super confus et j'aimerais beaucoup d'aide.

Donc, dans la déclaration PostConfirmation, dans la section des événements cognitoUserPool. Quelle devrait être la valeur de «pool»? J'ai essayé le nom réel du pool d'utilisateurs et il continue de créer de nouveaux pools d'utilisateurs. J'ai également essayé la valeur directement sous «Resources» (dans votre cas «CognitoUserPoolMyUserPool»).

Maintenant, dans la valeur de votre «pool», vous avez dit que vous saisissez «MyUserPool» sans la partie CognitoUserPool, mais mon nom de ressource est différent. Alors, quel doit être mon nom? J'ai essayé le nom complet et cela ne fonctionne pas.

@ Studio2133

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

Dans cet exemple, vous utiliseriez ce qui se trouve après CognitoUserPool comme valeur de pool. Dans ce cas, ce serait MyUserPool

@robotlemons Merci pour la réponse rapide!

Je devrais donc renommer ma ressource. Actuellement, je ne l'ai pas démarré avec CognitoUserPool. Actuellement, il s'appelle simplement: MycompanyUserPool. Je vais le changer en: CognitoUserPoolMyCompanyUserPool ... Est-ce correct?

Oui

Envoyé de mon iPhone

Le 11 avril 2019 à 12 h 33, Studio2133 [email protected] a écrit:

@robotlemons Merci pour la réponse rapide!

Je devrais donc renommer ma ressource. Actuellement, je ne l'ai pas démarré avec CognitoUserPool. Actuellement, il s'appelle simplement: MycompanyUserPool. Je vais le changer en: CognitoUserPoolMyCompanyUserPool ... Est-ce correct?

-
Vous recevez cela parce que vous avez été mentionné.
Répondez directement à cet e-mail, affichez-le sur GitHub ou désactivez le fil de discussion.

@ Studio2133 Dans votre cas, vous devriez faire ce que @robotlemons a dit, ajoutez simplement CognitoUserPool avant le nom de votre pool d'utilisateurs réel MycompanyUserPool .

Donc, à la fin, vous devriez avoir: CognitoUserPoolMycompanyUserPool pour ce nom de pool.

La définition de votre pool d'utilisateurs dans cognito-user-pool.yml doit donc être:

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

Et puis la définition du déclencheur lambda dans serverless.yml devrait être:

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

Cela fonctionnait bien pour nous dans notre dernier projet (appelant d'autres lambdas et services à partir d'AWS à l'aide du déclencheur PostConfirmation ) et je n'ai eu aucun problème.

N'oubliez pas de supprimer chaque pool dupliqué avant de créer les pools fixes afin qu'il n'y ait rien de déroutant dans le panneau de configuration AWS.

J'espère que cela est utile et résout le problème!

@ Studio2133
Lorsque vous ajoutez un événement cognitoUserPool à un lambda, Serverless génère automatiquement un nouveau pool d'utilisateurs Cognito et l'ajoute à votre modèle CloudFormation généré. Le nom de ressource logique CloudFormation de ce pool est CognitoUserPool {normalizedPoolId}, où normalizedPoolId est le nom que vous indiquez pour le pool dans votre événement cognitoUserPool. Il s'agit du pool auquel le déclencheur sera connecté. Afin de connecter le déclencheur à votre propre pool que vous déclarez dans Resources, vous pouvez profiter de cette convention de dénomination pour remplacer le pool généré en ajoutant l'événement cognitoUserPool. Pour ce faire, vous devez utiliser CognitoUserPool {normalizedPoolId} comme nom de ressource logique de votre pool dans votre section Ressources. Cela obligera Serverless à utiliser ce pool pour connecter votre déclencheur, au lieu d'en générer un nouveau.

Plus de détails sur cette approche peuvent être trouvés dans cet article.

Cette page vous a été utile?
0 / 5 - 0 notes