2

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

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

所以当用户确认发生时,这个 lambda 函数预计会触发。

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

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

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

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

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

4

2 回答 2

1

我不熟悉 GO,但从 AWS API 的角度来看,当您使用 AWS 控制台将触发器添加到 lambda 函数时会发生什么,您有效地为另一个服务添加了调用您的函数的权限。AWS图形控制台调用场景下的底层API,方便使用。

如果您使用 AWS CLI 或开发工具包创建或配置 Lambda 函数,则需要显式调用add-permissionAPI。

这是 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

于 2019-07-05T17:28:05.287 回答
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)
于 2019-07-08T04:32:06.017 回答