Amazon web services 如何从AWS Lambda向Cognito用户池组添加用户?
我试图从一个在确认后被触发的lambda向cognito用户池组添加一个用户a。这是lambda的代码: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'});
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函数哪个用户去哪里。但不确定是否还有其他更好的方法\