AWS Cognito 트리거 설정하기 (with. Lambda)

MIMI·2022년 12월 14일
3

이 글에서는 이 전에 작성했던 https://velog.io/@mimi0905/AWS-Cognito-사용자-인증-가입-로그인-amazon-cognito-identity-js 게시글의 결과물을 가지고 테스트를 수행합니다.

AWS Cognito에는 트리거를 설정하여 가입 및 로그인 시, 지정된 함수를 실행할 수 있습니다.
트리거 유형은 아래와 같이 4가지가 있습니다.

  • 가입
    - 사전 가입 트리거
    • 사후 확인 트리거
    • 사용자 마이그레이션 트리거
  • 인증
    - 사전 인증 트리거
    • 사후 인증 트리거
    • 사전 토큰 생성 트리거
  • 사용자 지정 인증
    - 인증 챌린지 정의
    • 인증 챌린지 생성
    • 인증 챌린지 응답 확인
  • 메시징
    - 사용자 지정 메시지 트리거

이번 포스팅에서는 사전 가입 트리거와 사후 확인 트리거(게시 확인)를 설정하겠습니다.

목표

  1. 사전 가입 트리거를 설정하여, 특정 이메일만 가입 가능하도록 함
  2. 사후 확인 트리거를 설정하여, 사용자 이메일 인증 시, AWS DynamoDB에 해당 이메일을 저장하도록 함

사전 가입 트리거 설정

사전 가입 람다 흐름

AWS Cognito 트리거 설정을 위해 AWS Management Console에 접속합니다.

이전 콘솔의 경우

최신 콘솔의 경우

람다 함수 생성을 시작합니다.
함수 이름을 설정하고, 함수 작성에 사용할 언어를 선택합니다.
저는 Node.js 16.x를 사용하여 작성합니다.
Node.js 16 이상의 버전을 사용할 경우, 이 글에서 작성된 코드가 작동하지 않을 수 있으므로 주의해주세요.

emailArr 배열에 들어있는 메일 주소만 가입이 가능하도록 작성한 코드입니다. 람다 함수를 작성, 배포한 후, 트리거에 할당합니다.

exports.handler = (event, context, callback) => {
    const emailArr=['xxx@gmail.com','yyy@gmail.com'];
    console.log(event.request.userAttributes);
    if(!emailArr.includes(event.request.userAttributes.email)){
        var error = new Error("Cannot register users with this email");
        callback(error,event);
    }
    callback(null,event);
};


그러면 회원가입을 시도해서 테스트 해보겠습니다.
이 글에서는 이 전에 작성했던 https://velog.io/@mimi0905/AWS-Cognito-사용자-인증-가입-로그인-amazon-cognito-identity-js 게시글의 결과물을 가지고 테스트를 수행합니다.

람다함수는 CloudWatch에서 로그를 모니터링 할 수 있습니다.

람다함수에 작성했던 console.log(event.request.userAttributes)의 로그를 확인할 수 있습니다.

만약에 emaillArr에 들어있지 않은 이메일로 가입을 시도할 경우, 400에러가 뜨고, UserLambdaValidationException: PreSignUp failed with error Cannot register users with this email. 이라는 에러코드와 메세지가 돌아옵니다.

CloudWatch에서도 에러사항을 확인 할 수 있습니다.

사후 확인 트리거 설정

사전 확인 트리거를 거쳐 cognito 가입이 성공적으로 진행되면, 회원가입시 사용했던 메일로 사용자 인증 메일이 발송되었을 겁니다.

사후 확인 트리거는 위 이미지의 링크를 클릭하여 이메일이 확인 되었을 때 실행되는 트리거입니다.
사후 확인 트리거에 할당할 람다 함수를 작성해보겠습니다.
이메일 확인시, 사용자의 이메일을 DynamoDB에 저장하는 람다함수입니다.

var aws = require('aws-sdk');
var docClient  = new aws.DynamoDB.DocumentClient();

exports.handler =  (event,context,callback) => {
  let date = new Date();
  let params={
        TableName:'TEST_USER',
        Item:{
          'email':event.request.userAttributes.email,
          'createdAt': date.toISOString(),  
          'updatedAt': date.toISOString(),
            }
   		};
  docClient.put(params, (err,data)=>{
  			if(err) {
                     var error = new Error("Failed to save new user");
                     callback(error, event);
            }else{
              		console.log(params.Item);
                    callback(null, event);
            }
  });
};

위 람다 함수가 제대로 작동하려면 아래의 사전 작업이 필요합니다.

  • DynamoDB에 TEST_USER 테이블을 미리 생성
  • 람다 함수가 DynamoDB에 데이터를 쓸 수 있도록 권한을 부여

※ 람다 함수 권한 추가하기

1 )
2 )
3 )

모든 작업이 완료되면 사후 확인 트리거에 람다함수를 할당합니다.

이제 이메일 확인 링크를 클릭하면, 이메일이 확인되고, 사후 확인 트리거가 실행되어 TEST_USER 테이블에 사용자 정보가 저장될 것입니다.

profile
Web Developer

0개의 댓글