Serverless: Conjunto de usuários do Cognito duplicado criado quando recurso e função são definidos com o mesmo nome

Criado em 11 set. 2018  ·  10Comentários  ·  Fonte: serverless/serverless

Este é um (relatório de bug)

Descrição

Para relatórios de bug:
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)}

Ele acabou com a criação de dois UserPools com o mesmo nome e um com função de gatilho anexado, outro com políticas anexadas e outras coisas que eu defino no cognito-user-pool

Problemas semelhantes ou dependentes:

  • # 4207

Dados Adicionais

"sem servidor": "1.30.3"

bug caaws-event-cognito

Comentários muito úteis

Sua solução funcionou perfeitamente @robotlemons !! 🎉 Muito obrigado por compartilhar isso!

A parte que foi realmente confusa para mim foi que os documentos chamam CognitoUserPool MyUserPool o tempo todo, e eu estava definindo UserPoolName: ${self:provider.stage}-user-pool , então pensei que ao declarar o lambda , deveríamos estar fazendo:

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

Eu pensei que desta forma estava definindo o mesmo nome para ambos, mas a chave aqui é dar ao atributo pool o mesmo valor que seu CognitoUserPool, por isso que os documentos o definiram como MyUserPool .

Então, finalmente declarei meu pool de usuários em cognito-user-pool.yml como:

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

E em serverless.yml o lambda é declarado 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 isso ajude alguém no futuro!

Muito obrigado novamente por sua ajuda! 💯

Todos 10 comentários

Tendo o mesmo problema. Curioso para saber quando uma resolução pode ser alcançada?

Também estou tendo esse problema e não consigo resolvê-lo seguindo os exemplos nos documentos ou outros problemas fechados

@ Ccastillo06 Consegui corrigir o problema ao fazer isso ... (as partes em negrito são a parte importante. Isso funcionou para mim mesmo depois de estar enfrentando todos os problemas.

CognitoUserPoolMyUserPool:
Digite: AWS :: Cognito :: UserPool
Propriedades:
UserPoolName: mypool _ $ { self: provider.stage } _auth_pool
Atributos de usuário:
- o email
Esquema:
- Nome: given_name
AttributeDataType: String
Mutável: verdadeiro
Requerido: verdadeiro
- Nome: family_name
AttributeDataType: String
Mutável: verdadeiro
Requerido: verdadeiro
- Nome: email
AttributeDataType: String
Mutável: falso
Requerido: verdadeiro
- Nome: phone_number
AttributeDataType: String
Mutável: verdadeiro
Requerido: verdadeiro
AutoVerifiedAttributes:
- o email

pós-confirmação:
manipulador: ..
Tamanho da memória: ...
eventos:
- http:
caminho: ...
método: colocar
integração: lambda
cors: verdadeiro
autorizador:
tipo: COGNITO_USER_POOLS
authorizerId:
Ref: ApiGatewayAuthorizer
- cognitoUserPool:pool: MyUserPoolgatilho: PostConfirmation

Sua solução funcionou perfeitamente @robotlemons !! 🎉 Muito obrigado por compartilhar isso!

A parte que foi realmente confusa para mim foi que os documentos chamam CognitoUserPool MyUserPool o tempo todo, e eu estava definindo UserPoolName: ${self:provider.stage}-user-pool , então pensei que ao declarar o lambda , deveríamos estar fazendo:

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

Eu pensei que desta forma estava definindo o mesmo nome para ambos, mas a chave aqui é dar ao atributo pool o mesmo valor que seu CognitoUserPool, por isso que os documentos o definiram como MyUserPool .

Então, finalmente declarei meu pool de usuários em cognito-user-pool.yml como:

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

E em serverless.yml o lambda é declarado 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 isso ajude alguém no futuro!

Muito obrigado novamente por sua ajuda! 💯

@ Ccastillo06
Sinto muito, estou super confuso e adoraria uma ajuda.

Portanto, na declaração PostConfirmation, na seção de eventos cognitoUserPool. Qual deve ser o valor de 'pool'? Tentei o nome real do pool de usuários e ele continua criando novos pools de usuários. Também tentei o valor diretamente em 'Recursos' (no seu caso 'CognitoUserPoolMyUserPool').

Agora, em seu valor de 'pool', você disse que inseriu 'MyUserPool' sem a parte CognitoUserPool, mas meu nome de recurso é diferente. Então, qual deveria ser meu nome? Tentei o nome completo e não funcionou.

@ Studio2133

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

Neste exemplo, você usaria o que quer que esteja após CognitoUserPool como seu valor de pool. Neste caso, seria MyUserPool

@robotlemons Obrigado pela resposta rápida!

Portanto, devo renomear meu recurso. Atualmente não o tenho começando com CognitoUserPool. Atualmente é chamado apenas de: MycompanyUserPool. Vou mudar para: CognitoUserPoolMyCompanyUserPool ... Correto?

sim

Enviado do meu iPhone

Em 11 de abril de 2019, às 12h33, Studio2133 [email protected] escreveu:

@robotlemons Obrigado pela resposta rápida!

Portanto, devo renomear meu recurso. Atualmente não o tenho começando com CognitoUserPool. Atualmente é chamado apenas de: MycompanyUserPool. Vou mudar para: CognitoUserPoolMyCompanyUserPool ... Correto?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

@ Studio2133 No seu caso, você deve fazer o que @robotlemons disse, apenas adicione CognitoUserPool antes do nome do seu pool de usuários real MycompanyUserPool .

Portanto, no final você deve ter: CognitoUserPoolMycompanyUserPool para esse nome de pool.

Portanto, sua definição de pool de usuários em cognito-user-pool.yml deve ser:

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

E então a definição do gatilho lambda em serverless.yml deve ser:

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

Isso está funcionando bem para nós em nosso último projeto (chamando outros lambdas e serviços da AWS usando o gatilho PostConfirmation ) e não tive nenhum problema.

Lembre-se de remover todos os pools duplicados antes de criar os pools fixos para que não haja nada confuso no painel de controle da AWS.

Espero que isso seja útil e resolva o problema!

@ Studio2133
Ao adicionar um evento cognitoUserPool a um lambda, o Serverless gera automaticamente um novo Cognito User Pool e o adiciona ao seu modelo CloudFormation gerado. O nome do recurso lógico CloudFormation desse pool é CognitoUserPool {normalizedPoolId}, em que normalizedPoolId é o nome que você fornece para o pool em seu evento cognitoUserPool. Este é o pool ao qual o gatilho será conectado. Para conectar o gatilho ao seu próprio pool declarado em Recursos, você pode aproveitar essa convenção de nomenclatura para substituir o pool gerado adicionando o evento cognitoUserPool. Para fazer isso, você precisa usar CognitoUserPool {normalizedPoolId} como o nome do recurso lógico do seu pool na seção Recursos. Isso fará com que o Serverless use esse pool para conectar seu gatilho, em vez de gerar um novo.

Mais detalhes sobre essa abordagem podem ser encontrados neste artigo.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

davepwsmith picture davepwsmith  ·  3Comentários

tomyam1 picture tomyam1  ·  3Comentários

arabold picture arabold  ·  3Comentários

chris-hailstorm picture chris-hailstorm  ·  3Comentários

BarakChamo picture BarakChamo  ·  3Comentários