리뷰 기능 개발을 하다가 User의 정보가 필요한데 Cognito User Pool에 저장되어있는 정보를 DB로 옮겨서 User의 정보를 받아와야 하는 상황이 발생했다.
구글링을 열심히 했고 내가 내린 결론은 Lambda를 이용하여 함수를 만들고 그 함수를 Cognito에서 trigger로 적용하자는 결론이었다.
그렇게 Lambda에서 함수를 만들었고 test를 거쳤는데, 에러가 발생했던 부분은 cognito의 custom attribute를 맵핑하는 부분에서 에러가 발생하였다.
매개변수를 잘못 넘겨서 에러가 발생했다.
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