Hướng Dẫn Migrate Người Dùng Giữa Hai Amazon Cognito User Pools: Chi Tiết Từng Bước, Thực Chiến Chuyên mục Devops 2025-07-01 2 Lượt xem 2 Lượt thích 0 Bình luận
1. 📌 Vì Sao Chúng Ta Phải Migrate User Giữa Hai Cognito User Pools?
Trong quá trình phát triển hệ thống, việc phải migrate dữ liệu người dùng từ Cognito User Pool cũ sang một User Pool mới là tình huống thường gặp. Nguyên nhân có thể đến từ:
-
Thay đổi khu vực (Region): Ví dụ bạn cần chuyển sang Region gần người dùng hơn để giảm latency.
- Bỏ email bắt buộc: Vì cognito ko cho phép chỉnh lại attribute sau khi tạo cognito user pool,
-
Thay đổi cấu trúc Pool: Ví dụ chuyển từ User Pool có xác thực bằng password sang passwordless (OTP).
-
Thay đổi chiến lược xác thực: Ví dụ bạn tích hợp social login (Google, Apple) vào một Pool mới, hoặc tách Pool theo môi trường (dev, staging, production).
-
Tối ưu kiến trúc: Có thể bạn muốn gom nhóm hoặc phân tách user để dễ quản lý.
Tuy nhiên, Amazon Cognito không hỗ trợ migrate user trực tiếp giữa hai Pool nếu không sử dụng tính năng Import Job (vốn yêu cầu file CSV chuẩn và không hỗ trợ migrate mật khẩu một cách đơn giản nếu không có hash gốc).
Vậy làm sao để migrate?
👉 Chúng ta sẽ export thủ công danh sách user từ Pool A, parse dữ liệu, và tạo lại user thủ công ở Pool B bằng AWS CLI.
2. 🚀 Tổng Quan Các Bước Thực Hiện Migrate
Bước 1: Export user từ Pool A
Có 2 cách:
-
Cách 1: Dùng list-users CLI → Xuất ra file JSON.
-
Cách 2: Dùng tính năng export CSV (nếu muốn import bằng Import Job nhưng có nhiều hạn chế).
Bước 2: Parse dữ liệu JSON
-
Lọc ra các trường quan trọng:
-
Username
-
email
-
email_verified
-
custom:one_time_link (nếu có)
-
UserStatus (để phân biệt user thường và user social)
-
Bước 3: Migrate dữ liệu sang Pool B
-
Dùng admin-create-user để tạo user.
-
Dùng admin-set-user-password để set password nếu user là loại xác thực bằng password.
-
Với user social (Google, Apple…), không cần set password, chỉ cần migrate skeleton để họ login lại và Cognito sẽ tự cập nhật.
Bước 4: Xử lý đặc biệt cho từng loại user
-
User thường → Phải ở trạng thái CONFIRMED.
-
User social → Trạng thái EXTERNAL_PROVIDER, sẽ hoàn thiện khi user tự login lại.
3. 🛠 Hướng Dẫn Thực Chiến Chi Tiết
3.1. Export user từ Pool A
bash
Sao chépChỉnh sửa
aws cognito-idp list-users \
--user-pool-id ap-southeast-1_xxxxxx \
--region ap-southeast-1 > users_pool_a.json
3.2. Chuẩn Bị Script Migrate
Dưới đây là script thực tế đã được kiểm chứng:
#!/bin/bash
# ==== Cấu hình cần chỉnh ====
POOL_B_ID="ap-northeast-1_X7fSkpO23"
REGION="ap-northeast-1"
INPUT_FILE="users_pool_liveapp_user.json"
OUTPUT_PASSWORD_FILE="migrated_passwords_v2.csv"
# ==== Kiểm tra cần thiết ====
if ! command -v jq &> /dev/null
then
echo "❌ Cần cài jq để xử lý JSON."
exit 1
fi
echo "username,email,password,is_social" > "$OUTPUT_PASSWORD_FILE"
user_count=$(jq '.Users | length' "$INPUT_FILE")
echo "🔎 Tổng số user cần migrate: $user_count"
echo
# Duyệt từng user
jq -c '.Users[]' "$INPUT_FILE" | while read -r user; do
username=$(echo "$user" | jq -r '.Username')
email=$(echo "$user" | jq -r '.Attributes[] | select(.Name=="email") | .Value')
email_verified=$(echo "$user" | jq -r '.Attributes[] | select(.Name=="email_verified") | .Value')
one_time_link=$(echo "$user" | jq -r '.Attributes[] | select(.Name=="custom:one_time_link") | .Value')
identities=$(echo "$user" | jq -r '.Attributes[] | select(.Name=="identities") | .Value')
if [ "$email" == "null" ] || [ -z "$email" ]; then
echo "⚠️ Bỏ qua user $username vì không có email."
continue
fi
is_social="false"
if [ "$identities" != "null" ] && [ -n "$identities" ]; then
is_social="true"
fi
echo "➡️ Migrate user: $username (social: $is_social)"
# Chuẩn bị mảng thuộc tính
attr="Name=email,Value=$email Name=email_verified,Value=$email_verified"
if [ "$one_time_link" != "null" ] && [ -n "$one_time_link" ]; then
attr="$attr Name=custom:one_time_link,Value=$one_time_link"
fi
# Tạo user
aws cognito-idp admin-create-user \
--user-pool-id "$POOL_B_ID" \
--username "$username" \
--user-attributes $attr \
--message-action SUPPRESS \
--region "$REGION" > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "❌ Lỗi khi tạo user $username"
continue
fi
if [ "$is_social" == "false" ]; then
# Với user thường, set password để account ở trạng thái CONFIRMED
password="YourTestPassword123!"
aws cognito-idp admin-set-user-password \
--user-pool-id "$POOL_B_ID" \
--username "$username" \
--password "$password" \
--permanent \
--region "$REGION" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ User $username migrated thành công với password (CONFIRMED)."
echo "$username,$email,$password,false" >> "$OUTPUT_PASSWORD_FILE"
else
echo "❌ Lỗi khi set password cho $username"
fi
else
echo "✅ User $username migrated thành công (social, đợi họ login lại để cập nhật EXTERNAL_PROVIDER)."
echo "$username,$email,N/A,true" >> "$OUTPUT_PASSWORD_FILE"
fi
echo "--------------------------------------"
sleep 0.2
done
echo "🎉 Hoàn tất migrate. Password được lưu tại $OUTPUT_PASSWORD_FILE"
4. 🎯 Một Số Lưu Ý Quan Trọng Khi Migrate Cognito
-
👉 Không thể migrate hashed password gốc nếu không dùng AWS Cognito Import Job đúng chuẩn CSV.
-
👉 Với social login, user cần login lại qua Google/Apple để Cognito hoàn thiện liên kết provider.
-
👉 Nếu migrate không đúng trạng thái CONFIRMED (hoặc quên set password), user sẽ không thể đăng nhập.
-
👉 Phải đảm bảo hệ thống đã cấu hình Cognito Pool mới ở cả backend và frontend trước khi test.
-
👉 Nếu dùng passwordless login, hãy đảm bảo pool mới hỗ trợ OTP flow tương ứng.
5. 🔥 Kết Luận
Việc migrate user giữa các Amazon Cognito User Pools không đơn giản như import dữ liệu thông thường. Bạn cần hiểu rõ:
-
Cơ chế hoạt động của Cognito.
-
Sự khác biệt giữa user thường và user social.
-
Luồng xác thực và trạng thái user.
Hy vọng bài viết này sẽ giúp bạn thực hiện migrate Cognito user pools một cách an toàn và chính xác.
Nếu bạn đang gặp vấn đề trong việc migrate Cognito, hãy để lại bình luận hoặc liên hệ với mình để được hỗ trợ chi tiết nhé! 🚀
Nếu bạn muốn mình viết thêm hướng dẫn chi tiết cách validate user sau khi migrate, mình có thể hỗ trợ viết thêm phần tiếp theo. Bạn chỉ cần nhắn mình nhé!
Bình luận (0)