Amazon web services 如何从AWS Lambda向Cognito用户池组添加用户?

Amazon web services 如何从AWS Lambda向Cognito用户池组添加用户?,amazon-web-services,aws-lambda,aws-sdk,amazon-cloudformation,amazon-cognito,Amazon Web Services,Aws Lambda,Aws Sdk,Amazon Cloudformation,Amazon Cognito,我试图从一个在确认后被触发的lambda向cognito用户池组添加一个用户a。这是lambda的代码: export async function postAuth(event, context, callback) { var AWS = require('aws-sdk'); var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({apiVersion: '2016-04-18'});

我试图从一个在确认后被触发的lambda向cognito用户池组添加一个用户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);

}
我知道这个lambda被触发是因为我可以看到“已执行”被登录到CloudWatch。但是,对
adminAddUserToGroup
的调用似乎根本没有通过,因为既没有记录错误消息,也没有记录成功消息

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

我怀疑这个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
的调用似乎根本没有通过。

除了资源之外,一切看起来都很好

您需要以以下格式提供Userpool: arn:aws:cognito idp:REGION:ACCOUNT\u ID:userpool/USER\u POOL\u ID

我正在做同样的事情,但使用资源:*


检查资源:*是否有效。这样您就可以确认问题所在。

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

请确保在函数体中使用promise版本

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

这样

将资源更改为“*”似乎没有效果。在cloudwatch上仍然没有成功或失败的日志。将函数从异步更改为正常修复了它!嘿@MrD,我和你一样有一个确切的需求(使用自定义角色和组)。在我看来,这很简单,但我在某个地方读到,
adminAddUserToGroup
函数需要AWS帐户凭据,但我看不到传递它的方法。如果Lambda已分配适当的IAM角色,是否不需要将AWS凭据传递给服务提供商?不考虑任何帐户凭据,我设法让它正常工作,但后来我遇到了另一个问题,即为了从中添加/删除用户,您需要cognito用户名(与标识池id相反)。当一个lambda被cognito触发时,用户名是可用的,但是对于s3事件来说它不是。啊,我明白了。我能够使用稍微修改过的代码版本使其正常工作。我将Lambda函数设置为由“后验证”触发,它能够成功地将用户添加到适当的组中。现在,我试图找到一种方法,通过cognito用户自定义属性从我的应用程序传递适当的组名,这样我就不会在函数中硬编码它。我想对于我最初的问题,我被AWS论坛和其他地方的各种帖子弄糊涂了,但正如你所说的那样,它是有效的。谢谢为什么要将组名存储在自定义属性上?如果您只是想避免硬编码组名,只需使用环境变量即可。它应该是超级简单的设置,特别是如果你使用无服务器框架或什么。我有3个不同类型的用户可以注册我们的应用程序和3个相应的组。用户(或组)的类型由用户在我们的应用程序中注册的方式决定。根据用户类型,我将在注册时从应用程序中为新用户分配自定义属性,然后最终使用该属性推断Lambda函数中的组名。环境变量很好,但我仍然需要一种方法来告诉lambda函数哪个用户去哪里。但不确定是否还有其他更好的方法\