![aws API Gateway - Lambda - DynamoDB로 Unity와 연결해보기 - 2편](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Dwvl%2FbtsF0sJYCsD%2FfXPfZCtvEmKXSpPXsmkA0K%2Fimg.png)
aws API Gateway - Lambda - DynamoDB로 Unity와 연결해보기 - 1편
https://dev-junwoo.tistory.com/151
aws API Gateway - Lambda - DynamoDB로 Unity와 연결해보기 - 1편
Aws 가입 - 프리티어 aws를 새로 가입하면 1년동안 여러 서비스들을 한도 내에서 무료로 이용할 수 있다. 테스트를 위해 가입을 해주었다. 저 3가지 서비스 모두 프리티어일때 테스트용도로 무료로
dev-junwoo.tistory.com
API Gateway - Lambda는 연결 해두었고, 이제 DB를 연결해볼 차례이다.
DynamoDB
DynamoDB란?
aws에서 제공하는 NoSQL 데이터베이스 서비스다.
사용자가 서버를 관리하거나 소프트웨어를 설치하고 운영할 피요가없이
aws가 운영 관리, 자동 스케일링,백업,보안 모니터링등의 기능등을 제공한다.
파티션키와 정렬 키 2개를 통해 값을 불러온다.
정렬키는 선택이다.
테이블 만들기
간단한 테스트만 할것이기 때문에 , 파티션키만 UID로 설정해주고 테이블을 생성 해주었다.
항목생성
보통은 코드로 생성하겠지만, 임의로 직접 유저를 하나 추가 해보자.
파티션키인 UID는 필수 입력이고, 그 외에 닉네임과 아이템을 넣어주었다.
오른쪽 상단에 새 속성 추가로 여러가지 자료형을 넣을 수 있다.
List 가 아닌 문자열 집합(string set)을 쓰면 파이썬에서 지원하지 않기때문에 list로 변환해주는 과정을 한번 더 거쳐야해서 상당히 귀찮아진다..
람다 함수 코드 수정
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/dynamodb.html
Amazon DynamoDB - Boto3 1.34.69 documentation
Previous Using subscription filters in Amazon CloudWatch Logs
boto3.amazonaws.com
DynamoDB와 연결하기 위해서는 aws가 제공하는 sdk를 사용해야하는데,
파이썬은 Boto3라는 sdk를 사용한다.
도큐먼트를 보고 이 두가지를 참고해서 미리 작성해둔 데이터를 얻어보자.
import json
import boto3
def lambda_handler(event, context):
# DynamoDB 리소스 초기화
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("Test_Table")
# 파티션 키로 항목 가져오기
response = table.get_item(
Key={
"UID": "1234", # 예시 파티션 키 값
}
)
# 처리 결과 반환
return {
'statusCode': 200,
'body': json.dumps(response["Item"],ensure_ascii=False)
}
이런식으로 코드를 바꿔주었다.
그런데..
AccessDeniedException이 뜬다.
지금 이 오류는 해당 람다가 Dynamodb에 접근할 권한이 없어서 뜨는 오류이다.
람다 - Dynamodb 권한 추가
이런식으로 dynamoDB의 access 권한을 부여한다.
다시 람다를 실행해보니 원하는대로 잘 들어온다.
유니티로 테스트하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class User
{
public string UID;
public string NickName;
public List<string> Inventory;
}
public class NetworkTest : MonoBehaviour
{
private const string url = "주소";
IEnumerator Start()
{
UnityWebRequest webRequest = UnityWebRequest.Get(url);
yield return webRequest.SendWebRequest();
if (webRequest.result == UnityWebRequest.Result.Success)
{
var data = JsonUtility.FromJson<User>(webRequest.downloadHandler.text);
Debug.Log($"UID: {data.UID}");
Debug.Log($"닉네임: {data.NickName}");
foreach (var item in data.Inventory)
{
Debug.Log($"아이템: {item}");
}
}
else
{
Debug.Log("통신 실패!");
}
}
}
이런 식으로 설정해둔 데이터가 잘 나온다.
역직렬화를 할때 클래스 변수들의 대소문자를 구별하게 하려면 JsonUtility대신 Newtonsoft.Json같은 라이브러리를 써야한다.
쿼리 스트링으로 UID 넘기기
아무 사이트에 들어가서 보면 주소 뒤에 ?이름 = 값
이런식으로 나와있는게 있는데, 쿼리 스트링이라고 한다.
서버에 추가적인 정보를 전달 할 수 있다.
https://example.com/api?variable=value&key=value2
이런식으로 여러개도 전달 가능하다.
람다에서는 event 딕셔너리 안에 queryStringParameters 이라는 키값으로 들어온다.
import json
import boto3
def lambda_handler(event, context):
# DynamoDB 리소스 초기화
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("Test_Table")
uid = event['queryStringParameters']['UID']
# 파티션 키로 항목 가져오기
response = table.get_item(
Key={
"UID": uid, # 예시 파티션 키 값
}
)
# 처리 결과 반환
return {
'statusCode': 200,
'body': json.dumps(response["Item"],ensure_ascii=False)
}
람다의 코드는 이런식으로 uid를 가져오도록 코드를 바꿔 보았다
UnityWebRequest webRequest = UnityWebRequest.Get(url+"?UID=1234");
유니티에서는 이런식으로 url뒤에 ?UID=1234 를 입력해주었다.
똑같이 성공했다.
데이터 수정하기
다시 boto3의 도큐먼트를 참고 해준다.
import json
import boto3
def lambda_handler(event, context):
# DynamoDB 리소스 초기화
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("Test_Table")
response = table.update_item(
Key={
"UID": "1234", # 예시 파티션 키 값
},
UpdateExpression='SET NickName = :val1',
ExpressionAttributeValues={
':val1': "ChangeName"
}
)
# 처리 결과 반환
return {
'statusCode': 200,
'body': "수정 성공!"
}
이런식으로 UID 1234의 닉네임을 ChangeName으로 변경해주었다.
들어가보니 아주 잘 바뀌어있다.
데이터 새로 추가하기
uid를 받아서 새로 추가 해주려고 한다.
역시 boto3 도큐먼트를 참고해준다.
import json
import boto3
def lambda_handler(event, context):
# DynamoDB 리소스 초기화
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table("Test_Table")
uid = event['queryStringParameters']['UID']
response = table.put_item(
Item={
"UID": uid,
"NickName": "NewUser",
"Inventory": ["테스트1","테스트2","테스트3"],
}
)
#response로 결과 확인 필요
# 처리 결과 반환
return {
'statusCode': 200,
'body': "추가 성공!"
}
여러 예외코드는 넣지 않았다.
유니티로 테스트하기가 상당히 귀찮아서 PostMan을 깔았다.
테스트 하기가 상당히 편하니 필요하신분은 깔아도 좋을 것 같다.
Postman API Platform | Sign Up for Free
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
www.postman.com
이런식으로 추가가 완료되었다.
마치며
계속 만들기가 귀찮아서 람다 하나를 파서 수정해가며 GET으로만 작업을 했는데,
실제로 적용할때는 여러 예외코드와 다양한 api를 만들어서 작업해야한다.
DynamoDB도 검색이나 수정,추가,삭제 등 여러가지 기능들을 지원하니 도큐먼트를 잘 참고해보시면 좋을것같다.
'서버 > AWS' 카테고리의 다른 글
aws API Gateway - Lambda - DynamoDB로 Unity와 연결해보기 - 1편 (0) | 2024.03.23 |
---|
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!