Cognito用户池-发布确认触发器,访问被拒绝的异常

时间:2019-07-05 13:12:41

标签: amazon-web-services aws-lambda amazon-cognito aws-sdk-go

我正在使用GO SDK创建一个Cognito用户池,我正在使用API​​ CreateUserPoolInput.

对于此lambda函数,我有一个后确认触发器。

因此,当发生用户确认时,预计将触发此lambda函数。

但是我遇到错误-访问被拒绝。

当我登录到AWS控制台并为此触发器重新配置此lambda函数时,它将起作用。

参考- https://forums.aws.amazon.com/thread.jspa?messageID=748566

我想使用AWS API提供调用权限。

是否有任何API或代码示例可供我参考以提供所需的访问权限?

2 个答案:

答案 0 :(得分:1)

我能够使用AddPermission API调用解决此问题。

这是代码段。

actionString := "lambda:InvokeFunction"
principalString := "cognito-idp.amazonaws.com"
sourceArn := userPoolArn
statementIdString := "cognitoaddpermission"

addPermissionInput := &lambda.AddPermissionInput{
    Action:       aws.String(actionString),
    FunctionName: aws.String(lambdaFunctionName),
    Principal:    aws.String(principalString),
    SourceArn:    aws.String(sourceArn),
    StatementId:  aws.String(statementIdString),
}

resultAddPermission, errAddPermission := lambdaSessionClient.AddPermission(addPermissionInput)

答案 1 :(得分:0)

我对GO并不熟悉,但是从AWS API的角度来看,当您使用AWS控制台向lambda函数添加触发器时,会有效地添加对另一项服务的调用权限。 AWS图形控制台在场景下调用底层API,以使其易于使用。

如果要使用AWS CLI或SDK创建或配置Lambda函数,则需要显式调用add-permission API。

这是AWS CLI的文档。在开始编写代码之前,这是一种练习和发现的好方法:https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html

以下是与Go SDK等效的文档:https://docs.aws.amazon.com/sdk-for-go/api/service/lambda/#Lambda.AddPermission

这是bash shell中的两个示例(一个用于授权API Gateway,一个用于授权Amazon S3触发功能,但是我相信您可以轻松地将其适应您的用例)

 aws lambda add-permission \
               --region $REGION \
               --function-name $FUNCTION_NAME \
               --statement-id 1 \
               --principal apigateway.amazonaws.com \
               --action lambda:InvokeFunction \
               --source-arn arn:aws:execute-api:$REGION:$ACCOUNT_ID:* >/dev/null
#
# Add permission to authorize S3 bucket to invoke Lambda
#
AWS_ACCOUNT_ID=$(echo $ROLE_EXEC_ARN | sed 's/^arn:aws:iam::\(.*\):.*$/\1/')
aws lambda add-permission --function-name $FUNCTIONNAME --region $REGION --profile $PROFILE --statement-id Id-x  --action "lambda:InvokeFunction" --principal s3.amazonaws.com --source-arn arn:aws:s3:::$BUCKETNAME --source-account $AWS_ACCOUNT_ID