如何在删除AWS Cognito用户池用户时触发Lambda函数?
实现AWS Cognito删除用户时触发Lambda的可行方案
由于Cognito用户池没有内置的用户删除操作触发器,你可以通过以下几种方式实现需求:
方案1:封装删除用户的API接口(实时触发首选)
不要直接调用Cognito原生的AdminDeleteUser或DeleteUser API,而是用API网关+Lambda封装删除逻辑:
- 让前端或后端服务调用这个自定义API来执行用户删除操作
- Lambda函数内先完成Cognito用户删除,再调用邮件发送逻辑(比如AWS SES)
- 示例Python代码片段:
import boto3 cognito_idp = boto3.client('cognito-idp') ses = boto3.client('ses') def lambda_handler(event, context): # 从请求参数中获取用户池ID和目标用户名 user_pool_id = event['userPoolId'] username = event['username'] # 执行Cognito用户删除 cognito_idp.admin_delete_user( UserPoolId=user_pool_id, Username=username ) # 获取用户邮箱 user_details = cognito_idp.admin_get_user( UserPoolId=user_pool_id, Username=username ) user_email = [attr['Value'] for attr in user_details['UserAttributes'] if attr['Name'] == 'email'][0] # 发送通知邮件 ses.send_email( Source='verified-sender@yourdomain.com', Destination={'ToAddresses': [user_email]}, Message={ 'Subject': {'Data': '您的账号已删除'}, 'Body': {'Text': {'Data': '您在我们平台的Cognito账号已被成功删除。'}} } ) return {'statusCode': 200, 'body': '操作完成'}
- 权限配置:给Lambda添加
cognito-idp:AdminDeleteUser、cognito-idp:AdminGetUser和ses:SendEmail的权限;确保SES已验证发件人和收件人邮箱(或处于生产模式)
方案2:通过CloudTrail+EventBridge触发(无需修改现有删除流程)
利用CloudTrail记录Cognito的API操作,再通过EventBridge捕获删除事件触发Lambda:
- 确保AWS账号已开启CloudTrail,且记录包含Cognito Identity Provider的API调用
- 在EventBridge中创建规则:
- 事件模式选择
AWS API Call via CloudTrail - 指定服务为
Cognito Identity Provider,操作匹配AdminDeleteUser和DeleteUser
- 事件模式选择
- 将目标Lambda函数关联到该规则
- Lambda函数从EventBridge事件中提取用户池ID和用户名,调用
AdminGetUser获取邮箱后发送邮件
- 注意:CloudTrail事件存在几分钟延迟,适合对实时性要求不高的场景
方案3:Post Authentication触发器(仅适用于用户主动删除场景)
如果删除操作由用户自身发起(比如登录后删除账号),可以借助Post Authentication触发器结合业务逻辑判断执行删除和邮件发送,但该方案局限性大,仅作为备选。
内容的提问来源于stack exchange,提问作者Rlaks
相关产品推荐
相关产品推荐

