Cognito User Pool 정보 DynamoDB에 저장하기

Seunghwa's Devlog·2022년 2월 4일
0

리뷰 기능 개발을 하다가 User의 정보가 필요한데 Cognito User Pool에 저장되어있는 정보를 DB로 옮겨서 User의 정보를 받아와야 하는 상황이 발생했다.

구글링을 열심히 했고 내가 내린 결론은 Lambda를 이용하여 함수를 만들고 그 함수를 Cognito에서 trigger로 적용하자는 결론이었다.

그렇게 Lambda에서 함수를 만들었고 test를 거쳤는데, 에러가 발생했던 부분은 cognito의 custom attribute를 맵핑하는 부분에서 에러가 발생하였다.
매개변수를 잘못 넘겨서 에러가 발생했다.

  • Lambda 함수 코드
var aws = require('aws-sdk');
var ddb = new aws.DynamoDB({apiVersion: '2012-10-08'});

exports.handler = async (event, context) => {
    console.log(event);

    let date = new Date();

    const tableName = process.env.TABLE_NAME;
    const region = process.env.REGION;
    
    // If the required parameters are present, proceed
    if (event.request.userAttributes.sub) {

        // -- Write data to DDB
        let ddbParams = {
            Item: {
                'id': {"S": event.request.userAttributes.sub},
                '__typename': {"S": 'User'},
                'username': {"S": event.userName},
                'name': {"S": event.request.userAttributes.name},
                'email': {"S": event.request.userAttributes.email},
                'nickname': {"S": event.request.userAttributes.nickname},
                'phone_number': {"S": event.request.userAttributes.phone_number},
                'vietnamDetailAddress': {"S": event.request.userAttributes['custom:vietnamDetailAddress']},
                'vietnamCity': {"S": event.request.userAttributes['custom:vietnamCity']},
                'vietnamPostcode': {"S": event.request.userAttributes['custom:vietnamPostcode']},
                'vietnamProvince': {"S": event.request.userAttributes['custom:vietnamProvince']},
                'createdAt': {"S": date.toISOString()},
            },
            TableName: tableName
        };

        // Call DynamoDB
        try {
            await ddb.putItem(ddbParams).promise()
            console.log("Success");
        } catch (err) {
            console.log("Error", err);
        }

        console.log("Success: Everything executed correctly");
        context.done(null, event);

    } else {
        // Nothing to do, the user's email ID is unknown
        console.log("Error: Nothing was written to DDB or SQS");
        context.done(null, event);
    }
};

custom attribute는 []를 사용하여 넘겨주면되고, 정상적으로 함수가 동작하는지 test할 때,

{
  "userName": "seunghwa333@gmail.com",
  "request": {
    "userAttributes": {
      "email": "seunghwa333@gmail.com",
      "email_verified": true,
      "name": "seunghwako",
      "sub": "abcdevfefe-1232132-cofeve",
      "nickname": "hihi",
      "phone_number": "01000000000",
      "vietnamDetailAddress": "as",
      "vietnamCity": "as",
      "vietnamProvince": "as",
      "vietnamPostcode": "as"
    }
  },
  "response": {}
}

이렇게 하면 custom attribute에 값이 할당이 안되고 "Validation Error: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes" 에러가 발생한다. 데이터 타입이 안맞아서 발생하는 오류인데,

{
  "userName": "seunghwa333@gmail.com",
  "request": {
    "userAttributes": {
      "email": "seunghwa333@gmail.com",
      "email_verified": true,
      "name": "seunghwako",
      "sub": "abcdevfefe-1232132-cofeve",
      "nickname": "hihi",
      "phone_number": "01000000000",
      "custom:vietnamDetailAddress": "as",
      "custom:vietnamCity": "as",
      "custom:vietnamProvince": "as",
      "custom:vietnamPostcode": "as"
    }
  },
  "response": {}
}

이렇게 "custom:"을 붙여서 맞게 넘겨주면 정상적으로 작동하고 정보가 dynamodb 테이블에 저장되는 것을 확인 가능하다.

참고 : https://medium.com/hackernoon/how-to-add-new-cognito-users-to-dynamodb-using-lambda-e3f55541297c

profile
에러와 부딪히고 새로운 것을 배우며 성장해가는 과정을 기록합니다!

0개의 댓글