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

无服务器

functions:
  preSignUp:
    handler: presignup.handler
    events:
      - cognitoUserPool:
          pool: ${self:provider.stage}MyUserPool
          trigger: PreSignUp

resources:
  - ${file(resources/cognito-user-pool.yml)}

最后,创建了两个具有相同名称的UserPool,一个具有附加的触发功能,另一个具有附加的策略以及我在Cognito-User-Pool中定义的其他内容

相似或相关的问题:

  • #4207

附加数据

“无服务器”:“ 1.30.3”

bug caaws-event-cognito

最有用的评论

您的解决方案就像一个魅力@robotlemons ! 非常感谢您的分享!

令我感到困惑的部分是,文档一直将CognitoUserPool称为MyUserPool ,而我正在设置UserPoolName: ${self:provider.stage}-user-pool ,所以我认为在声明lambda时,我们应该做:

- 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 ,lambda声明为:

  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
用户名属性:
-电子邮件
架构:
-名称:gived_name
AttributeDataType:字符串
可变:正确
必填:true
-名称:family_name
AttributeDataType:字符串
可变:正确
必填:true
-名称:电子邮件
AttributeDataType:字符串
可变:错误
必填:true
-名称:phone_number
AttributeDataType:字符串
可变:正确
必填:true
AutoVerifiedAttributes:
-电子邮件

确认后:
处理程序:..
内存大小:...
事件:
-http:
路径:...
方法:放
集成:lambda
cors:是的
授权人:
类型:COGNITO_USER_POOLS
authorizerId:
参考:ApiGatewayAuthorizer
-cognitoUserPool:池:MyUserPool触发条件:后确认

您的解决方案就像一个魅力@robotlemons ! 非常感谢您的分享!

令我感到困惑的部分是,文档一直将CognitoUserPool称为MyUserPool ,而我正在设置UserPoolName: ${self:provider.stage}-user-pool ,所以我认为在声明lambda时,我们应该做:

- 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 ,lambda声明为:

  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”)下的值。

现在,在您的“池”值中,您说您输入的“ MyUserPool”没有CognitoUserPool部分,但是我的资源名称不同。 那我叫什么名字? 我已经尝试过使用全名,但这不起作用。

@工作室2133

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的说明进行操作,只需在实际用户池MycompanyUserPool的名称之前添加CognitoUserPool MycompanyUserPool

因此,最后您应该具有: CognitoUserPoolMycompanyUserPool作为该池名称。

因此,您在cognito-user-pool.yml用户池定义应为:

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

然后serverless.yml的lambda触发器定义应为:

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

我在最近的项目中对我们来说还算不错(使用PostConfirmation触发器从AWS调用其他lambda和服务),根本没有任何问题。

在创建固定池之前,请记住删除所有重复的池,这样AWS控制面板中不会造成任何混乱。

希望这对您有帮助并解决问题!

@工作室2133
将cognitoUserPool事件添加到lambda时,Serverless会自动生成一个新的Cognito用户池,并将其添加到您生成的CloudFormation模板中。 此池的CloudFormation逻辑资源名称为CognitoUserPool {normalizedPoolId},其中normalizedPoolId是您在cognitoUserPool事件中为池提供的名称。 这是触发器将连接到的池。 为了将触发器连接到您在参考资料中声明的自己的池,您可以利用此命名约定来覆盖通过添加cognitoUserPool事件生成的池。 为此,您需要在“资​​源”部分中使用CognitoUserPool {normalizedPoolId}作为池的逻辑资源名称。 这将导致Serverless使用此池将触发器连接到,而不是生成新触发器。

这种方法的更多细节中可以找到这个文章。

此页面是否有帮助?
0 / 5 - 0 等级