Cognito User Pool 정보 DynamoDB에 저장하기

seunghwa17·2022년 2월 4일

리뷰 기능 개발을 하다가 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

0개의 댓글