如何从 AWS Lambda 将用户添加到 Cognito 用户池组?
How to add a user to a Cognito User Pool Group from AWS Lambda?
我正在尝试从触发 post 确认的 lambda 中将用户添加到 cognito 用户池组。这是该 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
的呼叫似乎根本没有通过。
一切看起来都很好,除了资源。
您需要按以下格式提供用户池:
arn:aws:cognito-idp:REGION:ACCOUNT_ID:userpool/USER_POOL_ID
我正在做同样的事情,但使用资源:*。
检查资源:* 是否有效。这样您就可以确认问题区域。
主要问题是您将函数定义为 Async。
如果定义异步函数,则不应在正文中使用回调。
请确保您在函数体中使用了 promise 版本。
try {
await cognitoISP.adminAddUserToGroup(params).promise();
} catch (error) {
console.error(error);
}
像这样
我正在尝试从触发 post 确认的 lambda 中将用户添加到 cognito 用户池组。这是该 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
的呼叫似乎根本没有通过。
一切看起来都很好,除了资源。
您需要按以下格式提供用户池: arn:aws:cognito-idp:REGION:ACCOUNT_ID:userpool/USER_POOL_ID
我正在做同样的事情,但使用资源:*。
检查资源:* 是否有效。这样您就可以确认问题区域。
主要问题是您将函数定义为 Async。 如果定义异步函数,则不应在正文中使用回调。
请确保您在函数体中使用了 promise 版本。
try {
await cognitoISP.adminAddUserToGroup(params).promise();
} catch (error) {
console.error(error);
}
像这样