Serverless: リソースと関数が同じ名前で定義されている場合、Cognitoユーザープールが重複して作成されます

作成日 2018年09月11日  ·  10コメント  ·  ソース: serverless/serverless

これは(バグレポート)です

説明

バグレポートの場合:
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)}

最終的に、同じ名前の2つのUserPoolが作成され、1つはトリガー関数が添付され、もう1つはポリシーが添付され、cognito-user-poolで定義するその他のものが作成されます。

類似または依存する問題:

  • #4207

追加データ

「サーバーレス」:「1.30.3」

bug caaws-event-cognito

最も参考になるコメント

あなたのソリューションは魅力的な@robotlemonsのように

私にとって本当に混乱した部分は、ドキュメントがCognitoUserPoolを常にMyUserPoolと呼んでいて、 CognitoUserPoolを設定していたこと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
UsernameAttributes:
- Eメール
スキーマ:
-名前:given_name
AttributeDataType:文字列
可変:true
必須:true
-名前:family_name
AttributeDataType:文字列
可変:true
必須:true
-名前:メール
AttributeDataType:文字列
可変:false
必須:true
-名前:phone_number
AttributeDataType:文字列
可変:true
必須:true
AutoVerifiedAttributes:
- Eメール

postConfirmation:
ハンドラー:..
メモリー容量: ...
イベント:
-http:
道: ...
メソッド:置く
統合:ラムダ
cors:true
承認者:
タイプ:COGNITO_USER_POOLS
authorizerId:
参照:ApiGatewayAuthorizer
--cognitoUserPool:プール:MyUserPoolトリガー:PostConfirmation

あなたのソリューションは魅力的な@robotlemonsのように

私にとって本当に混乱した部分は、ドキュメントがCognitoUserPoolを常にMyUserPoolと呼んでいて、 CognitoUserPoolを設定していたこと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イベントセクションにあります。 'pool'の値はどうあるべきですか? ユーザープールの実際の名前を試しましたが、新しいユーザープールが作成され続けています。 また、「リソース」(あなたの場合は「CognitoUserPoolMyUserPool」)のすぐ下の値を試しました。

'pool'値で、CognitoUserPool部分なしで 'MyUserPool'を入力したと言いましたが、私のリソース名が異なります。 それで、私の名前はどうあるべきですか? フルネームを試しましたが、うまくいきません。

@ Studio2133

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

この例では、CognitoUserPoolの後にあるものをプール値として使用します。 この場合、MyUserPoolになります

@robotlemons迅速な対応ありがとうございます!

したがって、リソースの名前を変更する必要があります。 現在、CognitoUserPoolで始まるものはありません。 現在は、MycompanyUserPoolと呼ばれています。 次のように変更します:CognitoUserPoolMyCompanyUserPool ...それは正しいですか?

はい

私のiPhoneから送信された

2019年4月11日には、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

最新のプロジェクト( PostConfirmationトリガーを使用してAWSから他のラムダとサービスを呼び出す)でこれを正常に機能させましたが、まったく問題はありませんでした。

AWSコントロールパネルで混乱が生じないように、固定プールを作成する前に、重複するすべてのプールを削除することを忘れないでください。

これがお役に立てば、問題が解決することを願っています。

@ Studio2133
cognitoUserPoolイベントをラムダに追加すると、サーバーレスは新しいCognitoユーザープールを自動的に生成し、生成されたCloudFormationテンプレートに追加します。 このプールのCloudFormation論理リソース名はCognitoUserPool {normalizedPoolId}です。ここで、normalizedPoolIdは、cognitoUserPoolイベントでプールに指定する名前です。 これは、トリガーが接続されるプールです。 リソースで宣言する独自のプールにトリガーを接続するために、この命名規則を利用して、cognitoUserPoolイベントを追加することによって生成されたプールをオーバーライドできます。 これを行うには、リソースセクションでプールの論理リソース名としてCognitoUserPool {normalizedPoolId}を使用する必要があります。 これにより、サーバーレスは新しいプールを生成する代わりに、このプールを使用してトリガーを接続します。

このアプローチの詳細については、この記事を参照し

このページは役に立ちましたか?
0 / 5 - 0 評価