无服务器复制用户池而不是按名称重用

Serverless duplicates user pools instead of reusing by name

我正在使用无服务器部署 AWS CloudFormation 模板和一些功能,这是我的 serverless.yml 文件的一部分:

resources:
  Resources:
    MyUserPool: #An inline comment
      Type: "AWS::Cognito::UserPool"
      Properties:
        UserPoolName: "MyUserPool"
        Policies:
          PasswordPolicy: 
            MinimumLength: 7
            RequireLowercase: false
            RequireNumbers: true
            RequireSymbols: false
            RequireUppercase: false
functions:
  preSignUp:
    handler: presignup.validate
    events:
      - cognitoUserPool:
          pool: "MyUserPool"
          trigger: PreSignUp

如您所见,两个用户池名称相同,但是当我 运行 无服务器部署时,创建了 2 个同名的用户池。

这是一个错误还是我遗漏了什么?

我也发现这是 counter-intuitive 并且起初令人困惑。但是, 实际上是预期的(并记录在案的)行为。

当您将 Cognito 事件作为触发器附加到函数时,Serverless 会为您创建一个用户池,甚至无需询问。 Source:

This will create a Cognito User Pool with the specified name.

所以在你的例子中,一个用户池是由 cognitoUserPool 事件创建的,另一个是由你的 Resources 部分创建的。 Resources创建的是正确的(有自定义密码策略),lambda触发器创建的是默认配置。 "Overriding a generated User Pool" 标题下描述了修复。

您在“资源”部分的用户池键前面加上 CognitoUserPool,这将导致您的触发器和资源在生成的 CloudFormation 模板中引用同一个用户池。

在你的情况下,这意味着简单地改变这个:

resources:
  Resources:
    MyUserPool:
      Type: "AWS::Cognito::UserPool"

对此:

resources:
  Resources:
    CognitoUserPoolMyUserPool:
      Type: "AWS::Cognito::UserPool"

已使用无服务器 1.26.0 进行测试

正确的方法是在您的函数 cognitoUserPool 属性上设置 existing: true,如下所示...

  createAuthChallenge:
    handler: services/auth/createAuthChallenge.handler
    events:
      - cognitoUserPool:
          pool: ${self:custom.stage}-user-pool
          trigger: CreateAuthChallenge
          existing: true

Serverless added support 2019 年 7 月。