【发布时间】: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 堆栈的结果的一部分。
标签: aws-lambda amazon-cloudformation amazon-cognito