Миграция Cognito из одной учетной записи AWS в другую без изменения подписи

Вопрос или проблема

В настоящее время мы используем Cognito в одной учетной записи AWS и хотим мигрировать в другую учетную запись. Однако, когда мы используем триггер Lambda в пуле пользователей новой учетной записи, новый пользователь создается при входе, включая все атрибуты, и sub пользователя изменится, так как он отличается между учетными записями. Наша настройка Cognito интегрирована с API Gateway, и мы полагаемся на sub для отслеживания пользователей, что является основной проблемой во время миграции.

Хотя мы можем создать пользовательский атрибут и сделать его обязательным для пользователей вместо использования sub, это вызывает еще одну проблему. Если мы внедрим пользовательский атрибут, он не изменится во время миграции, но нам все равно нужен надежный способ отслеживать пользователей в нашей базе данных MongoDB. Как мы можем эффективно отслеживать пользователей, если откажемся от использования sub?

функция lambda :

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 пула пользователей для разработки

try:
    # Аутентификация в старом пуле пользователей
    response = old_cognito_client.initiate_auth(
        UserPoolId=old_user_pool_id,
        ClientId='egshhhrhhdh',  # Замените на ваш фактический ID клиента разработки
        AuthFlow='USER_PASSWORD_AUTH',
        AuthParameters={
            'USERNAME': username,
            'PASSWORD': password,
        }
    )

    # Получение атрибутов пользователя из старого пула пользователей
    user_attributes = {attr['Name']: attr['Value'] for attr in response['UserAttributes']}
    original_sub = user_attributes.get('sub')  # Получите оригинальное значение sub

    # Создание пользователя в новом пуле (продакшн) с оригинальным sub в качестве пользовательского атрибута
    new_cognito_client.admin_create_user(
        UserPoolId='us-east-1_ieJhg8gfefasfefesGUx',  # ID пула пользователей для продакшн
        Username=username,
        UserAttributes=[
            {
                'Name': 'email',
                'Value': user_attributes.get('email', '')  # Получите email, если он существует, по умолчанию пустая строка
            },
            {
                'Name': 'custom:old_sub',
                'Value': original_sub  
            },
        ]
    )

    return {
        'userAttributes': {
            'email': user_attributes.get('email', ''),
        },
        'response': {
            'statusCode': 200,
            'body': 'Пользователь успешно мигрировал!',
        },
    }

except Exception as e:
    # Обработка исключений
    return {
        'statusCode': 500,
        'body': f'Ошибка: {str(e)}'
    }

Пожалуйста, подскажите мне лучший и простой способ миграции пулов пользователей Cognito?

Ответ или решение

Миграция пользователей Amazon Cognito между аккаунтами AWS без изменения sub: Полное руководство

Миграция пользователей из одного аккаунта AWS в другой с использованием Amazon Cognito – это задача, требующая внимательного подхода, особенно когда речь идёт о необходимости сохранить идентификатор пользователя (sub). Давайте рассмотрим, как можно выполнить эту задачу, учитывая все нюансы.

1. Проблематика миграции

Существует необходимость переноса пользователей из одного пула Cognito в другой, что вызывает проблемы с идентификацией пользователей. При попытке аутентификации в новом аккаунте пользователей с использованием триггеров Lambda, Amazon Cognito создает новых пользователей с уникальными значениями sub, что делает интеграцию с существующими системами (например, API Gateway и MongoDB) сложной.

2. Сохранение оригинального sub

Поскольку sub играет ключевую роль для идентификации пользователей в ваших системах, важно найти способ сохранить его при миграции. Альтернативным способом может быть создание пользовательского атрибута, который сохранит оригинальное значение sub.

3. Рекомендуемый подход к миграции

Шаг 1: Аутентификация пользователей в старом пуле

Используйте Lambda функцию для аутентификации пользователей на старом пуле Cognito. Ваша текущая функция на Python уже выполняет эту работу:

response = old_cognito_client.initiate_auth(
    UserPoolId=old_user_pool_id,
    ClientId='egshhhrhhdh',  # Идентификатор клиента старого пула
    AuthFlow='USER_PASSWORD_AUTH',
    AuthParameters={
        'USERNAME': username,
        'PASSWORD': password,
    }
)
Шаг 2: Перенос атрибутов пользователей

После успешной аутентификации, получите атрибуты пользователя, включая оригинальное значение sub.

Шаг 3: Создание пользователей в новом пуле

Создайте пользователей в новом пуле Cognito и сохраните оригинальный sub в качестве пользовательского атрибута (например, custom:old_sub). Это позволит вам соотнести новых пользователей с существующими записями в MongoDB.

new_cognito_client.admin_create_user(
    UserPoolId='us-east-1_ieJhg8gfefasfefesGUx',  # Идентификатор клиента нового пула
    Username=username,
    UserAttributes=[
        {
            'Name': 'email',
            'Value': user_attributes.get('email', '')
        },
        {
            'Name': 'custom:old_sub',
            'Value': original_sub
        },
    ]
)
Шаг 4: Обновление записей в MongoDB

После успешного создания пользователей в новом пуле нужно обновить записи в вашей базе данных MongoDB. Используйте пользовательский атрибут custom:old_sub для поиска соответствующих пользователей и обновления их данных.

4. Поддержка безубыточности

Если ваш проект требует временной безубыточности (т.е. возможности использования старых и новых аккаунтов), рассмотрите возможность реализации временной виртуализации идентификаторов пользователей в вашей базе данных.

Заключение

Миграция пользователей из одного пула Cognito в другой не так проста, как может показаться. Однако следуя описанному выше процессу, вы сможете сохранить оригинальные идентификаторы пользователей и обеспечить интеграцию с вашими системами. Хотя это требует времени и внимания к деталям, результат будет стоить затраченных усилий.

SEO Факторы

Эта статья содержит ключевые слова и фразы, такие как "миграция Cognito", "AWS", "пользовательские атрибуты", "MongoDB", которые могут улучшить видимость вашего контента в интернете, если вы решили опубликовать его в блоге или сайте, связанном с разработкой и облачными технологиями.

Ключ к успешной миграции – тщательное планирование, внимание к деталям и понимание вашего существующего процесса аутентификации пользователей. Вы получите не только возможность сохранить идентификаторы пользователей, но и улучшить удовлетворённость пользователей благодаря бесперебойной работе после миграции.

Оцените материал
Добавить комментарий

Капча загружается...