You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨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:系统适配与平滑过渡

  1. API与后端修改:
    • 解析JWT时,优先读取custom:old_sub字段作为用户标识,关联MongoDB中的原有数据
    • 可在用户登录后,异步将MongoDB中的用户标识更新为新池的sub,逐步完成过渡
  2. 权限配置:
    • 给新账户的Lambda角色添加cognito-idp:InitiateAuth和cognito-idp:AdminGetUser权限(针对旧账户的用户池ARN)
    • 在旧账户的Cognito用户池资源策略中,允许新账户的Lambda角色访问

关键优势

  • 无需批量迁移用户,用户首次登录时自动完成迁移,影响面小
  • 保留原sub作为自定义属性,完全兼容原有用户追踪逻辑
  • 平滑过渡,用户无感知

内容的提问来源于stack exchange,提问作者Sarath Varma T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:15:14