我想要解决在 Amazon Cognito 中将 AWS Lambda 函数配置为触发器时遇到的错误。
解决方法
以下是在 Amazon Cognito 中使用 Lambda 触发器时需要解决的常见错误。
“由于错误 AccessDeniedException,PreSignUp 调用失败。”
**注意:**错误消息中提到了触发器类型。例如,作为 PreSignUp 触发器附加到您的用户群体的 Lambda 函数会响应上述错误。
错误原因
当从 Amazon Cognito 控制台将 Lambda 函数作为触发器添加到您的用户群体时,Amazon Cognito 会执行以下操作:
- 向函数的资源策略添加所需的权限。此资源策略允许 Amazon Cognito 对某些事件触发器类型调用函数。
- 显示下列消息: “调用 Lambda 函数的权限 - 您授予了 Amazon Cognito 代表您调用此 Lambda 函数的权限。Amazon Cognito 将向该函数添加基于资源的策略语句。”
当删除作为触发器添加的函数时,也会发生此错误。如果删除 Lambda 触发器,则您必须更新用户群体中相应的触发器。例如,在删除后身份验证触发器时,您必须将相应用户群体中的后身份验证触发器设置为无。
解决错误
当在 Amazon Cognito 控制台之外创建触发器时,在将触发器分配给用户群体时,您必须明确添加权限。若要添加权限,请使用 AWS SDK、AWS 命令行界面 (AWS CLI) 或 Amazon CloudFormation。
当您添加权限时,Amazon Cognito 仅代表您的用户群体和账户调用函数。若要从 Lambda 控制台添加权限,请按照将基于资源的策略用于 Lambda 中的步骤进行操作。您也可以使用 AddPermission 操作。
以下是基于 Lambda 资源的策略示例,该策略允许 Amazon Cognito 调用函数。用户群体处于 aws:SourceArn 条件,账户处于 aws:SourceAccount 条件。
**注意:**请将 example_lambda_function_arn、example_account_number 和 example_user_pool_arn 替换为您自己的值。
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "lambda-allow-cognito",
"Effect": "Allow",
"Principal": {
"Service": "cognito-idp.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "example_lambda_function_arn",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "example_account_number"
},
"ArnLike": {
"AWS:SourceArn": "example_user_pool_arn"
}
}
}
]
}
“身份验证错误,请联系应用所有者。”
错误原因
发生此错误有两个原因:
- 除了自定义发件人 Lambda 触发器外,Amazon Cognito 同步调用了 Lambda 函数。该函数必须在 5 秒钟内响应。如果该函数没有响应,则 Amazon Cognito 会重试调用。在三次尝试失败后,该函数将超时。您无法更改 5 秒超时值。
- 如果 Amazon Cognito 在 5 秒内未收到触发器的响应,则在三次尝试失败后,Amazon Cognito 会返回错误。
解决错误
如果函数超时,则应用使用 AWS Lambda 函数的最佳实践来优化该函数。您可以让与用户群体关联的 Lambda 函数异步调用第二个 Lambda 函数。通过此设置,函数可以在不超时的情况下执行所有必需的操作。
“PreSignUp 失败,错误是模块 lambda_function 中出现语法错误。”
错误原因
当 Lambda 函数中存在任何语法错误时,Amazon Cognito 会返回此错误。
解决错误
请重新检查函数代码,并更正所有语法错误。
“PreSignUp 失败,错误是模块 lambda_function 上缺失处理程序“lambda_handler”。”
错误原因
函数的运行时设置包括处理程序参数。如果为 HandlerInfo 设置了错误的信息或语法,则函数将无法运行并导致此错误。
解决错误
在函数的配置中配置处理程序参数,以告知 Lambda 运行时需要调用的处理程序方法。
在 Python 中配置函数时,处理程序设置值是用点分隔的文件名和处理程序模块名称。例如,main.Handler 调用 main.py 中定义的处理程序方法。
有关处理程序语法的详细信息,请参阅修改运行时环境。
相关信息
重要注意事项
自定义 AWS Lambda 运行时