如何从 AWS Lambda 将用户添加到 Cognito 用户池组?

0x6*_*C38 5 amazon-web-services aws-cloudformation amazon-cognito aws-sdk aws-lambda

我正在尝试从确认后触发的 lambda 将用户 a 添加到认知用户池组。这是该 lambda 的代码:

    export async function postAuth(event, context, callback) {
      var AWS = require('aws-sdk');
      var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});
  
      var params = {
        GroupName: process.env.S3_GROUP_NAME,
        UserPoolId: event.userPoolId,
        Username: event.userName
      };

      cognitoidentityserviceprovider.adminAddUserToGroup(params, function(err, data) {
        if (err) console.log("Error");
        else     console.log("Success");
      });
  
      console.log("Executed.");

      context.succeed(event);

    }
Run Code Online (Sandbox Code Playgroud)

我知道这个 lambda 会被触发,因为我可以看到“执行”已记录在 CloudWatch 上。然而,调用adminAddUserToGroup似乎根本没有完成,因为错误消息和成功消息都没有被记录。

我尝试这样做的原因是这样我可以授予组不同的角色来访问后端资源。例如,我可以拥有一个Admin具有该角色的组CanWriteToS3和一个Customer具有该角色的组CanReadFromS3,并根据需要在组中添加或删除用户。

我怀疑此 lambda 的问题之一是它缺乏在组中添加和删除用户的正确权限。

这是附加到 lambda 的角色:

    GroupManagementRole:
      Type: AWS::IAM::Role
      Properties:
        RoleName: GroupManagementRole
        AssumeRolePolicyDocument:
          Version: "2012-10-17"
          Statement:
            - Effect: "Allow"
              Principal:
                Service: [lambda.amazonaws.com]
              Action: sts:AssumeRole
        Policies:
          - PolicyName: "GroupManagementPolicy"
            PolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - logs:CreateLogGroup
                    - logs:CreateLogStream
                    - logs:PutLogEvents
                  Resource: 
                    - 'Fn::Join':
                      - ':'
                      -
                        - 'arn:aws:logs'
                        - Ref: 'AWS::Region'
                        - Ref: 'AWS::AccountId'
                        - 'log-group:/aws/lambda/*:*:*'
                - Effect: "Allow"
                  Action: ["cognito-idp:AdminAddUserToGroup", "cognito-idp:AdminRemoveUserFromGroup"]
                  Resource:
                    Fn::Join:
                       - ""
                       - - "arn:aws:cognito-idp:us-east-1:XXXXXXXXXXX:userpool/us-east-1_XXXXXXX/*"
Run Code Online (Sandbox Code Playgroud)

我不确定是否应该使用 cognito 用户池的 arn 来获取资源,但我在线搜索后找不到任何有关 cognito 用户池组 ARN 的文档。

无论问题是什么,我都无法诊断它,因为我的电话adminAddUserToGroup似乎根本没有接通。

har*_*ley 8

主要问题是您将函数定义为异步。如果定义异步函数,则不应在主体中使用回调。

请确保在函数体中使用承诺版本。

try {
    await cognitoISP.adminAddUserToGroup(params).promise();
} catch (error) {
    console.error(error);
}
Run Code Online (Sandbox Code Playgroud)

像这样