Lambda 함수로 기존 Amazon Cognito 사용자 자동 마이그레이션하기

Lambda 함수로 기존 Amazon Cognito 사용자 자동 마이그레이션하기 (Automatically migrate known Amazon Cognito users with a Lambda function)

Amazon Cognito 사용자 풀(user pool)에 아직 가입되지 않은 사용자가 로그인하면 MigrateUser 트리거로 Lambda 함수를 호출할 수 있어요. 이 함수가 별도 테이블(예: DynamoDB)에서 기존 사용자를 찾아 사용자 풀로 자동 마이그레이션하는 시나리오를 이 예제가 보여줘요.

출처: AWS Lambda 개발자 안내서

본문

다음 코드 예제는 Lambda 함수로 기존 Amazon Cognito 사용자를 자동 마이그레이션하는 방법을 보여줘요.

이 시나리오는 다음 단계를 수행해요:

  • 사용자 풀이 MigrateUser 트리거에 대해 Lambda 함수를 호출하도록 구성한다.
  • 사용자 풀에 없는 사용자 이름과 이메일로 Amazon Cognito에 로그인한다.
  • Lambda 함수가 DynamoDB 테이블을 검색해 기존 사용자를 자동으로 사용자 풀로 마이그레이션한다.
  • 마이그레이션된 사용자의 암호를 재설정하기 위해 forgot password 흐름을 수행한다.
  • 새 사용자로 로그인한 다음 리소스를 정리한다.

구성 단계별로 Lambda 함수를 추가하고, 사용자 풀에 사용자를 등록·로그인·마이그레이션하는 전체 흐름을 코드로 구현해요.

Go (SDK for Go V2)

MigrateUser 는 이 시나리오의 각 단계를 개별 함수로 분리해 읽고 이해하기 쉽게 만든 타입이에요.

import (
	"context"
	"errors"
	"fmt"
	"log"
	"strings"
	"user_pools_and_lambda_triggers/actions"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider"
	"github.com/aws/aws-sdk-go-v2/service/cognitoidentityprovider/types"
	"github.com/awsdocs/aws-doc-sdk-examples/gov2/demotools"
)

// AddMigrateUserTrigger adds a Lambda handler as an invocation target for the MigrateUser trigger.
func (runner *MigrateUser) AddMigrateUserTrigger(ctx context.Context, userPoolId string, functionArn string) {
	log.Printf("Let's add a Lambda function to handle the MigrateUser trigger from Cognito.\n" +
		"This trigger happens when an unknown user signs in, and lets your function take action before Cognito\n" +
		"rejects the user.\n\n")
	err := runner.cognitoActor.UpdateTriggers(
		ctx, userPoolId,
		actions.TriggerInfo{Trigger: actions.UserMigration, HandlerArn: aws.String(functionArn)})
	if err != nil {
		panic(err)
	}
	log.Printf("Lambda function %v added to user pool %v to handle the MigrateUser trigger.\n",
		functionArn, userPoolId)

	log.Println(strings.Repeat("-", 88))
}

전체 예제와 실행 방법은 AWS Code Examples Repository 의 user_pools_and_lambda_triggers 에서 확인할 수 있어요.

더 알아보기 (Learn more)