能否按用户组筛选AWS Cognito指标?获取分组及单个用户登录次数
AWS Cognito按用户组/单个用户统计登录次数的解决方案
AWS CloudWatch提供的原生Cognito指标确实只有整个用户池维度的登录数据,没有直接支持按用户组或单个用户统计的选项。要实现需求,只能通过自定义方案来达成,以下是两种可行思路:
一、借助Cognito触发器记录登录事件
利用Cognito的Post Authentication触发器,在用户成功登录后触发Lambda函数,完成登录数据的自定义记录:
- 从触发器事件中提取用户ID、所属用户组(若存在)、登录时间等核心信息
- 将这些数据写入
Amazon DynamoDB表,表结构可设计为包含user_id、group_name、login_timestamp等字段 - 后续通过DynamoDB的查询或扫描操作,就能按用户组聚合统计登录次数,或查询单个用户的登录记录
示例Lambda逻辑片段(Python):
import boto3 import time dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('CognitoLoginEvents') def lambda_handler(event, context): user_id = event['request']['userAttributes']['sub'] group_names = event['request']['groupConfiguration']['groups'] if 'groupConfiguration' in event['request'] else [] login_time = int(time.time()) table.put_item( Item={ 'user_id': user_id, 'login_timestamp': login_time, 'group_names': group_names } ) return event
二、通过CloudTrail日志分析登录行为
AWS CloudTrail会记录Cognito的InitiateAuth和AdminInitiateAuth API调用事件,这些事件包含用户ID等关键信息:
- 开启CloudTrail并确保覆盖Cognito相关事件的记录
- 将CloudTrail日志导出到
Amazon S3,再通过Amazon Athena创建表进行查询分析 - 编写SQL语句按用户ID聚合统计登录次数;若要按用户组统计,需额外从Cognito导出用户组与用户的关联数据,再在Athena中完成关联查询
Athena查询示例(统计单个用户登录次数):
SELECT userIdentity.principalId AS user_id, COUNT(*) AS login_count FROM cloudtrail_logs WHERE eventName IN ('InitiateAuth', 'AdminInitiateAuth') AND eventSource = 'cognito-idp.amazonaws.com' AND errorCode IS NULL # 仅统计成功登录事件 GROUP BY userIdentity.principalId ORDER BY login_count DESC;
总结
目前Cognito没有原生支持按用户组或单个用户的登录次数统计,必须通过自定义事件记录或日志分析实现:
- 触发器方案实时性高、数据结构灵活,但需要维护Lambda和DynamoDB资源
- CloudTrail方案无需额外开发触发器,但日志存在延迟,且用户组关联需额外处理
内容的提问来源于stack exchange,提问作者Антон Чернобровкин
相关产品推荐
相关产品推荐

