将相同的 Cognito 用户池与 Lambda 函数和资源一起使用?

Use same Cognito UserPool with Lamda Function and Resources?

我正在使用无服务器框架,我需要为由 Lambda 函数创建的 UserPool 覆盖一些默认值。正确的做法是什么? 我的 serverless.yml 正在创建两个 user-pool(同名),一个用于 lambda 函数,另一个用于 UserPool 资源:

service: userpool

custom:
  stage: dev
  poolName: user-pool

provider:
  name: aws
  runtime: nodejs6.10
  stage: ${opt:stage, self:custom.stage}

functions:
  preSignUp:
    handler: handler.preSignUp
    events:
      - cognitoUserPool:
          pool: ${self:custom.poolName}
          trigger: PreSignUp

resources:
  Resources:
    UserPool:
      Type: "AWS::Cognito::UserPool"
      Properties:
        UserPoolName: ${self:custom.poolName}
        AliasAttributes:
          - email
        AutoVerifiedAttributes:
          - email
        Schema:
          - Name: name
            AttributeDataType: String
            Mutable: true
            Required: true
          - Name: email
            AttributeDataType: String
            Mutable: false
            Required: true

现在可以使用了,但是有人可以向我解释如何操作吗?下面的代码如何知道事件创建的 Cognito 资源和池是相同的?

service: userpool

custom:
  stage: dev

environment:
  USER_POOL: userPool

provider:
  name: aws
  runtime: nodejs6.10
  stage: ${opt:stage, self:custom.stage}

functions:
  preSignUp:
    handler: handler.preSignUp
    events:
      - cognitoUserPool:
          pool: TestPool
          trigger: PreSignUp

resources:
  Resources:
    CognitoUserPoolTestPool:
      Type: "AWS::Cognito::UserPool"
      Properties:
        AliasAttributes:
          - email
        AutoVerifiedAttributes:
          - email
        Schema:
          - Name: name
            AttributeDataType: String
            Mutable: true
            Required: true
          - Name: email
            AttributeDataType: String
            Mutable: false
            Required: true

根据 https://serverless.com/framework/docs/providers/aws/guide/resources/#aws---resources

中的无服务器文档

如果您创建了遵循此格式 CognitoUserPool{normalizedPoolId} 的 Cognito 用户池资源,您可以为每个资源提供 normalizedPoolId你的 lambda 函数。

在您的情况下,您已将 Cognito 用户池定义为“CognitoUserPoolTestPool”,这允许您在 lambda 中使用 TestPool。

这个问题在新版本中得到了更好的解决:

Add support for existing Cognito User Pools

您的函数事件应如下所示:

functions:
  preSignUp:
    handler: handler.preSignUp
    events:
      - cognitoUserPool:
          pool: ${self:custom.poolName}
          trigger: PreSignUp
          existing: true

无需在资源定义前额外添加"CognitoUserPool"。