跨AWS账户迁移Cognito用户池且保留原sub的方案咨询
AWS Cognito跨账户迁移方案(保留原用户追踪逻辑)
核心思路
利用Cognito的用户迁移触发器(User Migration Trigger),在用户首次登录新账户的用户池时,自动验证旧账户的用户凭证,同步所有用户属性,并将旧池的sub存入新池的自定义属性custom:old_sub中。之后修改API和MongoDB的用户关联逻辑,优先使用custom:old_sub匹配原有数据,实现平滑迁移。
步骤1:配置新用户池的迁移触发器
在新AWS账户的Cognito用户池里,添加用户迁移触发器:
- 创建一个Lambda函数(需配置跨账户访问权限,允许调用旧账户的Cognito服务)
- 在用户池的「触发器」选项卡中,将「用户迁移」关联到该Lambda函数
步骤2:实现Lambda迁移逻辑(修正版)
原代码存在两处关键问题:initiate_auth的响应不包含用户属性,且无需手动调用admin_create_user(触发器会自动创建用户)。以下是修正后的代码:
import boto3 def lambda_handler(event, context): username = event['userName'] password = event['request']['password'] # 初始化新旧账户的Cognito客户端(注意跨账户需配置权限) old_cognito_client = boto3.client('cognito-idp', region_name='us-east-1') new_cognito_client = boto3.client('cognito-idp', region_name='us-east-1') old_user_pool_id = 'us-east-1_hfa37RQDe' # 旧账户用户池ID old_client_id = 'egshhhrhhdh' # 旧账户用户池客户端ID try: # 1. 验证用户在旧池的凭证 old_cognito_client.initiate_auth( UserPoolId=old_user_pool_id, ClientId=old_client_id, AuthFlow='USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': username, 'PASSWORD': password, } ) # 2. 获取旧池的完整用户属性 user_response = old_cognito_client.admin_get_user( UserPoolId=old_user_pool_id, Username=username ) user_attributes = {attr['Name']: attr['Value'] for attr in user_response['UserAttributes']} original_sub = user_attributes.get('sub') # 3. 返回用户属性,让Cognito自动创建新用户(包含原sub的自定义属性) return { 'userAttributes': { **user_attributes, # 同步所有旧属性 'custom:old_sub': original_sub # 存入原sub }, 'finalUserStatus': 'CONFIRMED', # 标记用户为已确认,无需验证 'messageAction': 'SUPPRESS' # 不发送欢迎邮件 } except old_cognito_client.exceptions.NotAuthorizedException: # 凭证错误,返回认证失败 return { 'response': { 'errorMessage': '用户名或密码错误' } } except Exception as e: return { 'response': { 'errorMessage': f'迁移失败:{str(e)}' } }
步骤3:系统适配与平滑过渡
- API与后端修改:
- 解析JWT时,优先读取
custom:old_sub字段作为用户标识,关联MongoDB中的原有数据 - 可在用户登录后,异步将MongoDB中的用户标识更新为新池的
sub,逐步完成过渡
- 解析JWT时,优先读取
- 权限配置:
- 给新账户的Lambda角色添加
cognito-idp:InitiateAuth和cognito-idp:AdminGetUser权限(针对旧账户的用户池ARN) - 在旧账户的Cognito用户池资源策略中,允许新账户的Lambda角色访问
- 给新账户的Lambda角色添加
关键优势
- 无需批量迁移用户,用户首次登录时自动完成迁移,影响面小
- 保留原
sub作为自定义属性,完全兼容原有用户追踪逻辑 - 平滑过渡,用户无感知
内容的提问来源于stack exchange,提问作者Sarath Varma T
相关产品推荐
相关产品推荐

