
API Gateway에서 접근해서 Lambda를 사용하는데 성공했다면,
이젠 Unity 스크립트를 이용해, Lambda에 데이터를 송신하여 명령을 내려 DynamoDB를 운영해보자.
DynamoDB
DynamoDB란
- NoSQL(Not Only SQL) 데이터베이스
- 매우 빠른 쿼리 속도
- Auto-Scaling 기능 탑재
중요한 특징, 처음 데이터베이스를 만들면 크기가 정해지는데, Auto-Scaling의 경우는 데이터 크기 초과/축소될 때 테이블이 알아서 늘어나고 줄어든다. 비용 이점 - Key-Value 데이터 모델 지원
- 테이블 생성시 스키마 생성 필요 없음
실시간으로 들어오는 데이터를 보관하는데 탁월 - 모바일, 웹, IoT데이터 사용시 추천됨
- SSD 스토리지 사용
따라서 읽고 쓰는데 속도 빠름
Primary Keys(PK)
- DynamoDB에는 두가지의 PK 유형이 있음
1. 파티션키 (Partition Key)- 데이터를 나누고 분리시키는 키
- 고유 특징 (Unique Attribute)
- 실제 데이터가 들어가는 위치를 결정해줌
테이블 만들 때 파티션 키를 설정하면 데이터가 들어오는데, 데이터가 어디로 저장될지 파티션 키 내부에 들어 있는 해시함수를 돌리고 해시값이 반환되는데 이는 데이터가 저장될 주소값이다. 우리는 주소값으로 데이터를 찾는다. - 파티션키 사용시 동일한 두개의 데이터가 같은 위치에 저장될 수 없음. 파티션키 중복 불가!
- 복합키 (Composite Key)
- 파티션키(Partition Key) + 정렬키(Sort Key)
- 예시 : 똑같은 고객이 다른 날짜에 다른 물건을 구매
- 파티션키 : 고객아이디, 정렬키 : 날짜(Timestamp)
- 같은 파티션키의 데이터들은 같은 장소에 보관, 그다음 정렬키에 의해 데이터가 정렬됨
이정도 개념만 알고 있으면 데이터를 사용하는데 문제가 없다.
이제 DynamoDB를 생성해보자.

DynamoDB에 들어가 테이블 생성을 해보자.

생성을 완료했다면,

항목을 생성해보자.

Lambda with DynamoDB
1. Get ( DynamoDB를 이용한 데이터 읽기 )
새로운 람다를 만들어 준다.

새로운 Lambda 스크립트를 작성하자.
'use strict'
const AWS = require('aws-sdk');
AWS.config.update({ region: "본인의 지역"});
exports.handler = async (event, context) => {
const ddb = new AWS.DynamoDB({ apiVersion: "2012-10-08"}); //생략 가능
const documentClient = new AWS.DynamoDB.DocumentClient({ region: "본인의 지역"});
const params = {
TableName: "본인 테이블 이름",
Key: {
id: event.id //파티션 key
}
}
try {
const data = await documentClient.get(params).promise();
console.log(data);
return data;
} catch (err) {
console.log(err);
}
}
여기서 const ddb = new AWS.DynamoDB({apiVersion: "2012-10-08"}); 은 생략해도 문제없다.
현재 DynamoDB API 버전의 최신 버전 apiVersion: "2012-10-08는 언급하지 않아도 자동으로 등록되어 사용되기 때문이다.


/* This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes. */
var params = {
Key: {
"Artist": {
S: "Acme Band"
},
"SongTitle": {
S: "Happy Day"
}
},
TableName: "Music"
};
//실질적인 실행 함수.
//params = Music 테이블의 2개(Artist == Acme Band, SongTitle == Happy Day)의 키값을
//가진 데이터를 찾는다. 결과를 fuction으로 받는다.
dynamodb.getItem(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
/*
data = {
Item: {
"AlbumTitle": {
S: "Songs About Life"
},
"Artist": {
S: "Acme Band"
},
"SongTitle": {
S: "Happy Day"
}
}
}
*/
});
테스트를 실행해보자.
우선 API Gateway에 GET 메소드를 생성한다.

아직 UNITY에 연동되지 않았기에 Token 인증을 받지 않은 접근자에도 승인를 내려준다.

구분할 쿼리 값을 만들어준다.
URL 쿼리 문자열의 이름 경우 테이블에 생성할때, 지정해두었던 파티션키를 설정해준다.

받은 데이터 형식은 Json으로 받을 것이기 때문에

매핑 템플릿을 추가하여 json을 설정해둔다.
포스트맨을 이용해보자
포스트맨은 웹 세션을 주고 받을때, 많이 사용되는 툴이다.
포스트맨을 처음 이용하는 사람은 잠시 알아보고 오자.
https://incheol-jung.gitbook.io/docs/q-and-a/infra/2018-01-03-how-to-use-postman
POSTMAN - Incheol's TECH BLOG
POSTMAN을 사용해야 하는 이유?
incheol-jung.gitbook.io

우선 변경된 API Gateway를 배포하자.


위의 그림의 URL 엔드포인트를 저장해서 PostMan에 붙인다.

GET 부분에 URL 엔드포인트를 붙이고, Params 부분에 들어갈 Params를 설정해준다.
const params = // 포스트맨의 params으로 설정해야할 Lambda 함수 부분
{
TableName: "Study_DB",
Key:
{
id: event.id
}
}

정상적으로 들어오는 모습을 볼 수 있다.
2. Unity 연결
Unity는 현재 Cognito에서 Token을 받아 인증 받은 상태이기 때문에 API Gateway에서 설정을 다시 해주자.

API Gateway를 배포 한후 postman에서 다시 실행해보면,

인증 안되어 정보를 받을 수 없는 것을 볼 수 있다.
public async void CallTestApiGet()
{
string _id = "params에 넣을 key값";
//쿼리
UnityWebRequest webRequest = UnityWebRequest.Get("본인의 URL 엔드포인트" + "?id=" + _id);
// Cognito로 인증된 인증서를 넣는다.
webRequest.SetRequestHeader("Authorization", CredentialsManager._id_token);
//링크로 받을 타입을 설정.
webRequest.SetRequestHeader("Content-Type", "application/json");
await webRequest.SendWebRequest();
if (webRequest.result != UnityWebRequest.Result.Success)
{
Debug.Log("API call failed: " + webRequest.error + "\n" + webRequest.result + "\n" + webRequest.responseCode);
}
else
{
Debug.Log("Success, API call complete!");
Debug.Log(webRequest.downloadHandler.text);
Debug.Log("Data_" + webRequest.downloadHandler.data);
}
webRequest.Dispose();
}
UNITY 결과

정상적으로 들어오는 것을 확인할 수 있다.
참고 블로그 및 자료
https://velog.io/@songa29/AWS-DynamoDB%EB%9E%80
AWS - DynamoDB란?
NoSQL(Not Only SQL) 데이터베이스
velog.io
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html
Class: AWS.DynamoDB — AWS SDK for JavaScript
The modular AWS SDK for JavaScript (v3), the latest major version of AWS SDK for JavaScript, is now stable and recommended for general use. For more information, see the Migration Guide and API Reference. Class: AWS.DynamoDB Inherits: AWS.Service Object AW
docs.aws.amazon.com
https://www.youtube.com/watch?v=ijyeE-pXFk0&t=1756s
https://aws.amazon.com/ko/premiumsupport/knowledge-center/pass-api-gateway-rest-api-parameters/
API Gateway REST API 파라미터를 Lambda 함수 또는 HTTP 엔드포인트에 전달
쿼리 문자열 파라미터를 백엔드 AWS Lambda 함수와 HTTP 엔드포인트에 전달하려면 Amazon API Gateway REST API가 필요합니다. 어떻게 해야 합니까?
aws.amazon.com
'정리 > AWS' 카테고리의 다른 글
APIGateway Lambda with UNITY (0) | 2022.01.24 |
---|---|
AWS Cognito (Google) & Unity 구현 (0) | 2022.01.21 |
AWS Cognito를 이용한 소셜 로그인 (0) | 2022.01.21 |