Cognito 用户池未调用 lambda 函数

Posted

技术标签:

【中文标题】Cognito 用户池未调用 lambda 函数【英文标题】:Cognito user pool not invoking lambda function 【发布时间】:2021-05-05 06:01:12 【问题描述】:

我正在使用 Cloudformation 创建一个 Cognito 用户池,并将 LambdaConfig -> PreAuthentication 设置为同样使用 Cloudformation 创建的 Lambda 函数。问题是似乎没有调用 Lambda 函数。进行身份验证时,用户无需 PreAuthentication 逻辑干预即可登录,并且 lambda 函数的 Cloudwatch 日志为空。如果我在 Lambda 仪表板中测试该函数,它会正常运行。我没有收到任何错误。

此外,我在一个可以工作的现有设置上对这个 Cloudformation 设置进行建模。 Cloudformation 堆栈产生的资源似乎与工作版本具有相同的配置。

cloudformation 模板的相关部分如下所示:

  UserPool:
    Type: AWS::Cognito::UserPool
    Properties:
      LambdaConfig:
        PreAuthentication: !GetAtt UserAuthorizerFunction.Arn
      UsernameAttributes:
        - email
      UsernameConfiguration:
        CaseSensitive: false

Lambda 函数定义如下:

  UserAuthorizerFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: Authorize_Users
      Description: Authorizes users
      Handler: index.handler
      Role: !GetAtt AuthorizerFunctionRole.Arn
      Code:
        ZipFile: |
          const AWS = require('aws-sdk')
          // stuff
      Runtime: nodejs12.x

lambda 函数是使用看起来正确的基于资源的策略创建的:


  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    
      "Sid": "AuthorizerFunctionPermission-WSIGC4MBBT0C",
      "Effect": "Allow",
      "Principal": 
        "Service": "cognito-idp.amazonaws.com"
      ,
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:<redacted>:function:Authorize_Users",
      "Condition": 
        "ArnLike": 
          "AWS:SourceArn": "arn:aws:cognito-idp:us-east-1:<redacted>:userpool/us-east-1_<redacted>"
        
      
    
  ]

为什么我的 PreAuthentication 钩子没有被执行?有没有我没有想到的DependsOn 要求?

【问题讨论】:

您确定权限正确吗?函数 arn 建议名称为 Authorize_Users,但您的函数名称为 $StackName_Authorize_Users?另外,您是如何创建这些权限的?没有为他们显示 CFN 代码。 谢谢马尔辛。我对函数名称/ arn 的错。当我创建上面的问题时,我简化了一些事情。基于资源的策略中的 FunctionName 和 ARN 实际上是匹配的。我更新了上面的问题以表明这一点。回复:CFN 代码和创建权限 - 我不确定你的意思。基于资源的策略似乎是自动创建的,因为我将该函数用作认知触发器。 我同意这很可能是权限。我没有使用 Cognito 的经验,但是使用 API Gateway 当服务无权调用 lambda 时,您可以获得类似的行为。最后一个资源似乎确实授予了适当的访问权限,尽管我习惯将其视为AWS::Lambda::Permission 资源而不是策略。奇怪的是它是 JSON 而其他位是 YAML,它们是在单独的模板中吗?如果是这样,用户池在创建时是否无法访问 lambda?这可能是问题所在……似乎敲响了警钟。 感谢您查看此 404。您看到的 JSON 来自权限选项卡上的 Lambda 控制台页面。所以它与 Cloudformation yaml 模板是分开的。 JSON 实际上是使用 yaml 创建 cloudformation 堆栈的结果的一部分。 【参考方案1】:

事实证明这是一个已知问题 - 至少,其他人正在经历它: https://forums.aws.amazon.com/thread.jspa?messageID=897845&#897845

我需要删除ALLOW_CUSTOM_AUTH auth flow 选项并使用ALLOW_USER_PASSWORD_AUTH

【讨论】:

另外 - @404 认为应该需要 AWS::Lamda::Permission 是正确的。现有的基于资源的策略可能是通过在用户池触发器页面上选择函数作为触发器生成的。我刚站了一个新的堆栈,它没有被包括在内。然后,我将触发器更改为“无”,保存,然后将其更改回 lambda 函数,该 lambda 函数自动接收基于资源的策略,允许用户池启动它。

以上是关于Cognito 用户池未调用 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 Lambda 授权方的 AWS Cognito 和 API 网关

如何在 API 网关上的 cognito 授权方保护的 lambda 函数中获取 AWS Cognito 用户数据

在 AWS Cognito 用户池中删除用户时触发 Lambda 函数

在 cognito 用户池中添加 lambda 触发器时出现 404 错误

当用户添加到用户池时,Cognito 启动 lambda

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)