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

时间:2018-07-02 21:44:31

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

我正在尝试将用户a从通过触发后确认的lambda添加到认知用户池组。这是该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);

}

我知道该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/*"

我不确定是否应该使用cognito用户池的arn作为资源,但是我已经在线搜索了,找不到关于cognito用户池组ARN的任何文档。

无论出什么问题,由于我对adminAddUserToGroup的呼叫似乎都没有通过,所以我无法诊断出它。

2 个答案:

答案 0 :(得分:3)

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

请确保在函数主体中使用Promise版本。

try {
    await cognitoISP.adminAddUserToGroup(params).promise();
} catch (error) {
    console.error(error);
}

答案 1 :(得分:0)

除了Resource之外,其他所有内容都很好。

您需要以以下格式提供Userpool: arn:aws:cognito-idp:REGION:ACCOUNT_ID:userpool / USER_POOL_ID

我正在做同样的事情,但是使用Resource:*。

检查资源:*是否有效。这样,您将能够确认问题区域。