AWS Personalize putUsers 처리 Importing users incrementally
1. 개요
회사 프로젝트로 개인별 맞춤 추천 기능을 도입하기 위해서 AWS Personalize를 이용하기로 하였습니다.
AWS Personalize 세팅은 다른 직원이 담당하여 별도의 공부가 필요할 것 같아 일단 API를 보고 구현한 내용을 위주로 putItems, putEvents, getRecs를 정리해서 포스팅할 예정입니다.
- AWS Personalize put users는 AWS 저장소 만들어져 있는 사용자의 집합(dataset)에 1명 또는 여러명의 사용자 정보를 저장하는 것을 지원하기 위한 API 입니다.
2. 소스
2-1. Credentials 생성
- AWS Personalize 생성 시 AWS에서 제공받은 accessKeyId와 secretAccessKey를
이용하여 AwsBasicCredentials을 생성할 수 있게 method를 미리 구현합니다.
private AwsBasicCredentials getAwsBasicCredentials() {
final String awsAccessKeyId = '사용자 accessKeyId';
final String awsSecretAccessKey = '사용자 secretAccessKey';
return AwsBasicCredentials.create(awsAccessKeyId, awsSecretAccessKey);
}
2-2. Client 생성
- StaticCredentialsProvider를 이용해서 위에서 생성한 basicCredentials method를 호출하고
credentilas을 Client에 포함시킬 수 있게 하고, AWS를 생성한 region을 포함시켜서 getEventClient method를
호출할 때마다 client를 build 할 수 있게 method를 구현합니다.
public PersonalizeEventsClient getEventClient() {
return PersonalizeEventsClient.builder()
.credentialsProvider(StaticCredentialsProvider.create(getAwsBasicCredentials()))
.region(Region.AP_NORTHEAST_2)
.build();
}
2-3. putUsers Method 생성
- AWS Personalize API 에는 최대 10명의 User까지 받을 수 있다고 되어 있지만
우리가 필요한 User의 수는 1명이라 아래와 같이 구현을 했지만 복수의 User를 입력받아야 한다면
User user = User.builder().userId().build(); 부분을 For문으로 처리해도 됩니다.
- 필수 값인 userId, datasetArn 그리고 옵션인 properties는 호출하는 method에서 parameter로 받을 예정이기
때문에 Map<String, String> 으로 구현합니다.
- 나머지 putUsersRequest, putUsers 부분은 AWS Personalize API에 있는 그대로 구현합니다.
- 마지막 personalizeEventsClient.close 부분은 API에 없어서 그냥 안 해도 된다고 생각하고 생략 후
실제 운영서버에서 동작시켜 봤는데 점점 이 Client 때문에 메모리 full 이 발생해서 close 처리를 구현합니다.
public int putUsers(PersonalizeEventsClient personalizeEventsClient, Map<String, String> paramMap)
throws PersonalizeEventsException {
ArrayList<User> users = new ArrayList<>();
User user = User.builder().userId(paramMap.get("userId")).properties(paramMap.get("properties"))
.build();
users.add(user);
PutUsersRequest putUsersRequest = PutUsersRequest.builder()
.datasetArn(paramMap.get("datasetArn"))
.users(users)
.build();
int statusCode = personalizeEventsClient.putUsers(putUsersRequest)
.sdkHttpResponse().statusCode();
// client close 처리
personalizeEventsClient.close();
return statusCode;
}
2-4. putUsers 호출 Method 생성
- 필수인 datasetArn, userId 값을 paramMap에 넣고, 옵션으로 설정한 key에 해당하는 값들은 json string으로
입력을 해야 하기 때문에 JSON object와 JSON Array에 넣고 properties라는 key로 paramMap에 저장합니다.
- 위에서 구현해 놓았던 client와 paramMap 값을 parameter로 putUsers method를 호출하면 처리 결과 코드가
리턴 되게 구현합니다.
public static void main(String... args) {
AwsPersonalizeUtil awsPersonalizeUtil = new AwsPersonalizeUtil();
try {
Map<String, String> paramMap = new HashMap<>();
JSONArray propertiesArr = new JSONArray();
JSONObject propertiesObj = new JSONObject();
paramMap.put("datasetArn", "AWS 사용자 datasetArn");
paramMap.put("userId", "유저 id");
propertiesObj.put("properties option 1", "옵션 값 입력");
propertiesObj.put("properties option 2", "옵션 값 입력");
propertiesArr.add(propertiesObj);
paramMap.put("properties", String.valueOf(propertiesArr.get(0)));
int resultCode = awsPersonalizeUtil.putUsers(awsPersonalizeUtil.getEventClient(), paramMap);
System.out.println("AWS Personalize USER putUsers response Code = " + resultCode);
} catch (PersonalizeEventsException pee) {
System.out.println("PersonalizeEventsException - " + pee.awsErrorDetails().errorMessage());
} catch (AwsServiceException ae) {
System.out.println("AwsServiceException - " + ae.awsErrorDetails().errorMessage());
} catch (Exception ex) {
System.out.println("AwsPersonalizeUtil.awsPersonalizeProcess - Exception : " + ex.getMessage());
}
}
3. 마치며...
AWS API 문서에 나와 있는 내용을 나름 고민해서 구현한 부분이라 다시 한번 정리하여 내 것으로 만들고자 블로그에
포스팅을 진행하였습니다. 아직 putItems, putEvents, getRecs와 필요한 라이브러리 파일까지 정리해야 할 내용이 많이 있기 때문에 빠른 시일 내에 추가적으로 포스팅하도록 하겠습니다.
혹시 더 좋은 방법이나 잘못된 내용이 있으면 가차 없이 지적해 주시면 감사하겠습니다.
#참고자료
AWS Personalize putUsers API : https://docs.aws.amazon.com/personalize/latest/dg/importing-users.html