Amazon web services Cognito用户池-确认后触发器,拒绝访问异常

Amazon web services Cognito用户池-确认后触发器,拒绝访问异常,amazon-web-services,aws-lambda,amazon-cognito,aws-sdk-go,amazon-cognito-triggers,Amazon Web Services,Aws Lambda,Amazon Cognito,Aws Sdk Go,Amazon Cognito Triggers,我正在使用GoSDK创建一个Cognito用户池,我正在使用APICreateUserPoolPut. 我有一个确认后触发器,用于这个lambda函数 因此,当用户确认发生时,这个lambda函数将被触发 但我得到一个错误-访问被拒绝 当我登录到AWS控制台并为此触发器重新配置lambda函数时,它就工作了 参考文献- 我想使用AWSAPI提供调用权限 是否有任何API或代码示例可供我参考以提供所需的访问权限?我不熟悉GO,但从AWS API的角度来看,当您使用AWS控制台向lambda函数添

我正在使用GoSDK创建一个Cognito用户池,我正在使用API
CreateUserPoolPut.

我有一个确认后触发器,用于这个lambda函数

因此,当用户确认发生时,这个lambda函数将被触发

但我得到一个错误-访问被拒绝

当我登录到AWS控制台并为此触发器重新配置lambda函数时,它就工作了

参考文献-

我想使用AWSAPI提供调用权限


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

我不熟悉GO,但从AWS API的角度来看,当您使用AWS控制台向lambda函数添加触发器时,会发生什么情况?您实际上为另一个服务添加了调用您的函数的权限。AWS图形控制台调用场景下的底层API以使其易于使用

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

这是AWS CLI的文档。在开始编写代码之前,这是一种很好的实践和发现方法:

以下是Go SDK等价物的文档:

下面是bashshell中的两个示例(一个用于授权API网关,另一个用于授权amazons3触发函数,但我相信您可以根据您的用例轻松地进行调整)

aws lambda添加权限\
--地区$地区\
--函数名$function\u name\
--语句id 1\
--principal apigateway.amazonaws.com\
--操作lambda:InvokeFunction\
--源arn arn:aws:execute api:$REGION:$ACCOUNT\u ID:>/dev/null
#
#添加权限以授权S3 bucket调用Lambda
#
AWS_ACCOUNT_ID=$(echo$ROLE_EXEC_ARN | sed的/^ARN:AWS:iam::\(.*):.$/\1/)
aws lambda添加权限--函数名$FUNCTIONNAME--区域$region--概要文件$profile--语句id-x--操作“lambda:InvokeFunction”--主体s3.amazonaws.com--源arn arn:aws:s3::::$BUCKETNAME--源帐户$aws\U帐户\U id

我能够使用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)