Serverless: El grupo de usuarios de Cognito duplicado se crea cuando el recurso y la función se definen con el mismo nombre

Creado en 11 sept. 2018  ·  10Comentarios  ·  Fuente: serverless/serverless

Este es un (Informe de error)

Descripción

Para informes de errores:
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)}

Terminó con dos UserPools creados con el mismo nombre y uno con la función de activación adjunta, otro con políticas adjuntas y otras cosas que defino en cognito-user-pool

Problemas similares o dependientes:

  • N.º 4207

Datos adicionales

"sin servidor": "1.30.3"

bug caaws-event-cognito

Comentario más útil

¡¡Tu solución funcionó a las mil maravillas @robotlemons !! 🎉 ¡Muchas gracias por compartirlo!

La parte que fue realmente confusa para mí fue que los documentos llaman al CognitoUserPool como MyUserPool todo el tiempo, y yo estaba configurando UserPoolName: ${self:provider.stage}-user-pool , así que pensé que al declarar el lambda , deberíamos estar haciendo:

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

Pensé que de esta manera estaba configurando el mismo nombre para ambos, pero la clave aquí es darle al atributo pool el mismo valor que su CognitoUserPool, de ahí que los documentos lo establezcan como MyUserPool .

Así que finalmente declaré mi grupo de usuarios en cognito-user-pool.yml como:

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

Y en serverless.yml la lambda se declara como:

  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

¡Espero que esto ayude a alguien más en el futuro!

¡Muchas gracias de nuevo por tu ayuda! 💯

Todos 10 comentarios

Tener el mismo problema. ¿Tiene curiosidad por saber cuándo se puede llegar a una resolución?

También tengo este problema y no puedo resolverlo siguiendo los ejemplos en los documentos u otros problemas cerrados

@ Ccastillo06 Pude corregir el problema al hacerlo ... (las partes en negrita son la pieza importante. Esto funcionó para mí incluso después de experimentar todos los problemas.

CognitoUserPoolMyUserPool:
Tipo: AWS :: Cognito :: UserPool
Propiedades:
UserPoolName: mypool _ $ { self: provider.stage } _auth_pool
Nombre de usuario Atributos:
- correo electrónico
Esquema:
- Nombre: given_name
AttributeDataType: String
Mutable: verdadero
Requerido: verdadero
- Nombre: family_name
AttributeDataType: String
Mutable: verdadero
Requerido: verdadero
- Nombre Correo Electronico
AttributeDataType: String
Mutable: falso
Requerido: verdadero
- Nombre: número de teléfono
AttributeDataType: String
Mutable: verdadero
Requerido: verdadero
AutoVerifiedAttributes:
- correo electrónico

postConfirmation:
manipulador: ..
tamaño de la memoria: ...
eventos:
- http:
camino: ...
método: poner
integración: lambda
cors: cierto
autorizador:
tipo: COGNITO_USER_POOLS
authorizerId:
Ref: ApiGatewayAuthorizer
- cognitoUserPool:grupo: MyUserPooldisparador: PostConfirmation

¡¡Tu solución funcionó a las mil maravillas @robotlemons !! 🎉 ¡Muchas gracias por compartirlo!

La parte que fue realmente confusa para mí fue que los documentos llaman al CognitoUserPool como MyUserPool todo el tiempo, y yo estaba configurando UserPoolName: ${self:provider.stage}-user-pool , así que pensé que al declarar el lambda , deberíamos estar haciendo:

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

Pensé que de esta manera estaba configurando el mismo nombre para ambos, pero la clave aquí es darle al atributo pool el mismo valor que su CognitoUserPool, de ahí que los documentos lo establezcan como MyUserPool .

Así que finalmente declaré mi grupo de usuarios en cognito-user-pool.yml como:

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

Y en serverless.yml la lambda se declara como:

  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

¡Espero que esto ayude a alguien más en el futuro!

¡Muchas gracias de nuevo por tu ayuda! 💯

@ Ccastillo06
Lo siento, estoy muy confundido y me encantaría recibir ayuda.

Así que en la declaración PostConfirmation, en la sección de eventos cognitoUserPool. ¿Cuál debería ser el valor de 'piscina'? Probé el nombre real del grupo de usuarios y sigue creando nuevos grupos de usuarios. También probé el valor directamente en 'Recursos' (en su caso, 'CognitoUserPoolMyUserPool').

Ahora, en su valor de 'grupo', dijo que ingresó 'MyUserPool' sin la parte CognitoUserPool, pero el nombre de mi recurso es diferente. Entonces, ¿cuál debería ser mi nombre? Probé el nombre completo y no funciona.

@ Studio2133

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

En este ejemplo, usaría lo que esté después de CognitoUserPool como valor de su grupo. En este caso, sería MyUserPool

@robotlemons ¡ Gracias por la pronta respuesta!

Entonces debería cambiar el nombre de mi recurso. Actualmente no lo tengo comenzando con CognitoUserPool. Actualmente solo se llama: MycompanyUserPool. Lo cambiaré a: CognitoUserPoolMyCompanyUserPool ... ¿Es correcto?

si

Enviado desde mi iPhone

El 11 de abril de 2019, a las 12:33 p.m., Studio2133 [email protected] escribió:

@robotlemons ¡ Gracias por la pronta respuesta!

Entonces debería cambiar el nombre de mi recurso. Actualmente no lo tengo comenzando con CognitoUserPool. Actualmente solo se llama: MycompanyUserPool. Lo cambiaré a: CognitoUserPoolMyCompanyUserPool ... ¿Es correcto?

-
Estás recibiendo esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub o silencia el hilo.

@ Studio2133 En su caso, debe hacer lo que dijo @robotlemons , simplemente agregue CognitoUserPool antes del nombre de su grupo de usuarios actual MycompanyUserPool .

Entonces, al final, debería tener: CognitoUserPoolMycompanyUserPool para ese nombre de grupo.

Entonces, su definición de grupo de usuarios en cognito-user-pool.yml debería ser:

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

Y luego la definición del disparador lambda en serverless.yml debería ser:

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

He tenido esto funcionando bien para nosotros en nuestro último proyecto (llamando a otras lambdas y servicios de AWS usando el disparador PostConfirmation ) y no tuve ningún problema en absoluto.

Recuerde eliminar todos los grupos duplicados antes de crear los grupos fijos para que no haya nada confuso en el panel de control de AWS.

¡Espero que esto sea útil y resuelva el problema!

@ Studio2133
Cuando agrega un evento cognitoUserPool a una lambda, Serverless genera automáticamente un nuevo grupo de usuarios de Cognito y lo agrega a su plantilla de CloudFormation generada. El nombre de recurso lógico de CloudFormation de este grupo es CognitoUserPool {normalizedPoolId}, donde normalizedPoolId es el nombre que proporciona para el grupo en su evento cognitoUserPool. Este es el grupo al que se conectará el disparador. Para conectar el disparador a su propio grupo que declara en Recursos, puede aprovechar esta convención de nomenclatura para anular el grupo generado al agregar el evento cognitoUserPool. Para hacer esto, necesitas usar CognitoUserPool {normalizedPoolId} como el nombre de recurso lógico de tu grupo en tu sección de Recursos. Esto hará que Serverless use este grupo para conectar su disparador, en lugar de generar uno nuevo.

En este artículo se pueden encontrar más detalles sobre este enfoque.

¿Fue útil esta página
0 / 5 - 0 calificaciones