Serverless: Doppelter Cognito-Benutzerpool erstellt, wenn Ressource und Funktion mit demselben Namen definiert sind

Erstellt am 11. Sept. 2018  ·  10Kommentare  ·  Quelle: serverless/serverless

Dies ist ein (Bug Report)

Beschreibung

Für Fehlerberichte:
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)}

Am Ende wurden zwei UserPools mit demselben Namen und einer mit angehängter Triggerfunktion erstellt, andere mit angehängten Richtlinien und anderen Dingen, die ich im cognito-user-pool definiere

Ähnliche oder abhängige Probleme:

  • # 4207

Zusätzliche Daten

"serverlos": "1.30.3"

bug caaws-event-cognito

Hilfreichster Kommentar

Ihre Lösung hat wie ein Zauber @robotlemons funktioniert !! 🎉 Vielen Dank für das Teilen!

Der Teil, der für mich wirklich verwirrend war, war, dass die Dokumente die CognitoUserPool ganze Zeit als MyUserPool und ich UserPoolName: ${self:provider.stage}-user-pool einstellte, also dachte ich das, als ich das Lambda deklarierte sollten wir tun:

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

Ich dachte, dass ich auf diese Weise für beide den gleichen Namen festgelegt habe, aber der Schlüssel hier ist, dem Attribut pool den gleichen Wert wie Ihrem CognitoUserPool zu geben, weshalb die Dokumente ihn als MyUserPool festlegen.

Also habe ich meinen Benutzerpool in cognito-user-pool.yml wie folgt deklariert:

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

Und in serverless.yml das Lambda wie folgt deklariert:

  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

Hoffe das hilft jemand anderem in der Zukunft!

Nochmals vielen Dank für Ihre Hilfe! 💯

Alle 10 Kommentare

Das gleiche Problem haben. Neugierig, wann eine Lösung gefunden werden kann?

Ich habe auch dieses Problem und kann es nicht lösen, indem ich den Beispielen in den Dokumenten oder anderen geschlossenen Problemen folge

@ Ccastillo06 Ich konnte das Problem dadurch beheben ... (Fettgedruckte Teile sind das wichtige Element. Dies hat bei mir funktioniert, auch nachdem ich alle Probleme hatte.

CognitoUserPoolMyUserPool:
Typ: AWS :: Cognito :: UserPool
Eigenschaften:
UserPoolName: mypool _ $ { self: provider.stage } _auth_pool
BenutzernameAttribute:
- Email
Schema:
- Name: Vorname
AttributeDataType: String
Veränderlich: wahr
Erforderlich: wahr
- Name: Familienname
AttributeDataType: String
Veränderlich: wahr
Erforderlich: wahr
- Name: E-Mail
AttributeDataType: String
Veränderlich: falsch
Erforderlich: wahr
- Name: Telefonnummer
AttributeDataType: String
Veränderlich: wahr
Erforderlich: wahr
AutoVerifiedAttributes:
- Email

Nachbestätigung:
Handler: ..
Speichergröße: ...
Veranstaltungen:
- http:
Pfad: ...
Methode: setzen
Integration: Lambda
cors: wahr
Autorisierer:
Typ: COGNITO_USER_POOLS
authorizerId:
Ref: ApiGatewayAuthorizer
- cognitoUserPool:Pool: MyUserPoolAuslöser: PostConfirmation

Ihre Lösung hat wie ein Zauber @robotlemons funktioniert !! 🎉 Vielen Dank für das Teilen!

Der Teil, der für mich wirklich verwirrend war, war, dass die Dokumente die CognitoUserPool ganze Zeit als MyUserPool und ich UserPoolName: ${self:provider.stage}-user-pool einstellte, also dachte ich das, als ich das Lambda deklarierte sollten wir tun:

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

Ich dachte, dass ich auf diese Weise für beide den gleichen Namen festgelegt habe, aber der Schlüssel hier ist, dem Attribut pool den gleichen Wert wie Ihrem CognitoUserPool zu geben, weshalb die Dokumente ihn als MyUserPool festlegen.

Also habe ich meinen Benutzerpool in cognito-user-pool.yml wie folgt deklariert:

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

Und in serverless.yml das Lambda wie folgt deklariert:

  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

Hoffe das hilft jemand anderem in der Zukunft!

Nochmals vielen Dank für Ihre Hilfe! 💯

@ Ccastillo06
Es tut mir leid, ich bin super verwirrt und würde gerne Hilfe bekommen.

Also in der PostConfirmation-Deklaration im Abschnitt cognitoUserPool-Ereignisse. Was sollte der Wert für "Pool" sein? Ich habe den tatsächlichen Namen des Benutzerpools ausprobiert und er erstellt ständig neue Benutzerpools. Ich habe den Wert auch direkt unter 'Ressourcen' ausprobiert (in Ihrem Fall 'CognitoUserPoolMyUserPool').

Jetzt haben Sie in Ihrem 'Pool'-Wert angegeben, dass Sie' MyUserPool 'ohne den CognitoUserPool-Teil eingegeben haben, aber mein Ressourcenname ist anders. Wie sollte mein Name sein? Ich habe den vollständigen Namen ausprobiert und das funktioniert nicht.

@ Studio2133

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

In diesem Beispiel würden Sie alles verwenden, was nach CognitoUserPool als Poolwert steht. In diesem Fall wäre es MyUserPool

@robotlemons Danke für die prompte Antwort!

Also sollte ich meine Ressource umbenennen. Derzeit habe ich es nicht mit CognitoUserPool beginnen. Derzeit heißt es nur: MycompanyUserPool. Ich werde es ändern in: CognitoUserPoolMyCompanyUserPool ... Ist das richtig?

Ja

von meinem Iphone gesendet

Am 11. April 2019, um 12:33 Uhr, schrieb Studio2133 [email protected] :

@robotlemons Danke für die prompte Antwort!

Also sollte ich meine Ressource umbenennen. Derzeit habe ich es nicht mit CognitoUserPool beginnen. Derzeit heißt es nur: MycompanyUserPool. Ich werde es ändern in: CognitoUserPoolMyCompanyUserPool ... Ist das richtig?

- -
Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

@ Studio2133 In Ihrem Fall sollten Sie das tun, was @robotlemons gesagt hat. CognitoUserPool vor dem Namen Ihres tatsächlichen Benutzerpools MycompanyUserPool .

Am Ende sollten Sie also haben: CognitoUserPoolMycompanyUserPool für diesen Poolnamen.

Ihre Benutzerpooldefinition in cognito-user-pool.yml sollte also lauten:

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

Und dann sollte die Lambda-Trigger-Definition in serverless.yml lauten:

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

Ich hatte dies in unserem neuesten Projekt (das Aufrufen anderer Lambdas und Dienste von AWS mit dem PostConfirmation -Auslöser) in Ordnung und hatte überhaupt keine Probleme.

Denken Sie daran, jeden duplizierten Pool zu entfernen, bevor Sie die festen Pools erstellen, damit das AWS-Kontrollfeld keine Verwirrung stiftet.

Hoffe das ist nützlich und löst das Problem!

@ Studio2133
Wenn Sie einem Lambda ein cognitoUserPool-Ereignis hinzufügen, generiert Serverless automatisch einen neuen Cognito-Benutzerpool und fügt ihn Ihrer generierten CloudFormation-Vorlage hinzu. Der logische CloudFormation-Ressourcenname dieses Pools lautet CognitoUserPool {normalizedPoolId}, wobei normalizedPoolId der Name ist, den Sie für den Pool in Ihrem cognitoUserPool-Ereignis angeben. Dies ist der Pool, mit dem der Trigger verbunden wird. Um den Trigger mit Ihrem eigenen Pool zu verbinden, den Sie in Resources deklarieren, können Sie diese Namenskonvention nutzen, um den durch das Hinzufügen des Ereignisses cognitoUserPool generierten Pool zu überschreiben. Dazu müssen Sie CognitoUserPool {normalizedPoolId} als logischen Ressourcennamen Ihres Pools in Ihrem Ressourcenbereich verwenden. Dies führt dazu, dass Serverless diesen Pool verwendet, um Ihren Trigger zu verbinden, anstatt einen neuen zu generieren.

Weitere Details zu diesem Ansatz finden Sie in diesem Artikel.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen