- 개요

프로젝트에서 사용하는 PlayerState 클래스인 MatchPlayerState 클래스에는
진행된 게임의 결과와 관련된 여러 변수를 포함하고 있다
따라서 하나의 게임이 종료된 후에 해당 변수들의 값을 Dynamo DB의 데이터 테이블에 추가하는 람다 함수를 생성한다
- 절차
1) 람다 함수 생성 및 구성

MatchState의 변수의 값을 Dynamo DB의 테이블에 반영하는 RecordMatchStats 람다 함수를 생성한다

생성한 람다 함수에 대한 REGION 환경 변수를 추가하여 로직에서 리전에 접근할 수 있도록 구성하고
USER_POOL_ID 환경 변수를 추가하여 로직에서 User Pool에 접근할 수 있도록 구성한다
2) 정책 설정
2 - 1) 정책 설정 - AdminGetUser 리소스

생성할 람다 함수에 부여할 정책을 설정한다
우선, CognitoUserPools의 AdminGetUser 리소스를 사용할 수 있도록 설정한다
관리자 권한으로 특정 User Pool에 대한 사용자의 정보를 가져올 수 있도록 구성한다
이때 현재 사용중인 User Pool의 ARN을 추가해야 한다

생성한 정책의 이름을 위와 같이 설정한다
2 - 2) 정책 설정 - GetItem 리소스

2 - 1)에서 생성한 DS_RecordMatchStats 정책에 DynamoDB의 GetItem 리소스를 사용하도록 추가한다
GetItem은 Dynamo DB의 테이블에서 단일 아이템을 조회하는 목적으로 사용한다

추가한 GetItem 리소스에 대해 현재 사용중인 Players 테이블과 User Pool의 ARN을 설정한다
2 - 3) 정책 설정 - PutItem 리소스

2 - 1)에서 생성한 DS_RecordMatchStats 정책에 DynamoDB의 PutItem 리소스를 사용하도록 추가한다
GetItem은 Dynamo DB의 테이블에서 단일 아이템을 생성하거나 덮어쓰기하는 목적으로 사용한다
3) 람다 함수 정의
import { CognitoIdentityProviderClient, AdminGetUserCommand } from "@aws-sdk/client-cognito-identity-provider";
import { DynamoDBClient, GetItemCommand, PutItemCommand } from "@aws-sdk/client-dynamodb";
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb";
export const handler = async (event) => {
const cognitoIdentityProviderClient = new CognitoIdentityProviderClient( { region: process.env.REGION } );
const dynamoDBClient = new DynamoDBClient( { region: process.env.REGION } );
try {
const adminGetUserInput = {
Username: event.username,
UserPoolId: process.env.USER_POOL_ID
};
const adminGetUserCommand = new AdminGetUserCommand(adminGetUserInput);
const adminGetUserResponse = await cognitoIdentityProviderClient.send(adminGetUserCommand);
const sub = adminGetUserResponse.UserAttributes.find(attribute => attribute.Name === "sub").Value;
const email = adminGetUserResponse.UserAttributes.find(attribute => attribute.Name === "email").Value;
const getItemInput = {
TableName: "Players",
Key: marshall( { databaseid: sub } ),
};
const getItemCommand = new GetItemCommand(getItemInput);
const getItemResponse = await dynamoDBClient.send(getItemCommand);
let statsFromDB = getItemResponse.Item ? unmarshall(getItemResponse.Item) : { databaseid: sub };
const eventMatchStats = event.matchStats;
for (const key in eventMatchStats) {
if (statsFromDB[key] !== undefined) {
statsFromDB[key] += eventMatchStats[key];
} else {
statsFromDB[key] = eventMatchStats[key];
}
}
const putItemInput = {
TableName: "Players",
Item: marshall( { ...statsFromDB } )
};
const putItemCommand = new PutItemCommand(putItemInput);
await dynamoDBClient.send(putItemCommand);
return {
statusCode: 200,
body: `Updated match stats for ${event.username}`
};
} catch(error) {
return error;
}
};
RecordMatchStats 람다 함수의 코드를 위와 같이 구성한다
- AdminGetUser 리소스를 사용하여 event.username을 통해 User Pool에서 해당 유저의 상세 정보를 반환
- 상세 정보 중에서 sub 고유 식별자와 email 값을 추출
- sub 값을 기본 키로 GetItem 리소스를 사용하여 Players 테이블에서 플레이어의 기존 정보를 조회
- 기존 정보에 새로 들어온 event.matchStats 값을 합산
- PutItem 리소스를 사용하여 갱신된 정보를 Players 테이블에 덮어씌움
- 최종 실행 결과

RecordMatchStats 람다 함수에 사용할 테스트 데이터를 위와 같이 구성한다

테스트 실행 결과에서 위와 같이 statusCode : 200이 출력되어
성공적으로 테스트 데이터를 통한 람다 함수의 수행이 이뤄진 것을 확인할 수 있다

Dynamo DB의 Players 테이블에서 hits와 misees 속성과 값이 추가된 것도 확인할 수 있다
'언리얼 엔진 - 게임 프로젝트 > AWS GameLift를 활용한 데디케이트 FPS 프로젝트' 카테고리의 다른 글
| Dynamo DB - 2) 사용자 인증 처리 (0) | 2026.07.24 |
|---|---|
| Dynamo DB - 1) 플레이어 데이터 테이블 (0) | 2026.07.24 |
| PlayerSession 처리 - 최종) UI를 통한 게임에 접속한 플레이어 표시 (0) | 2026.07.23 |
| PlayerSession 처리 - 3) AInfo 클래스와 AGameState 클래스 (0) | 2026.07.16 |
| PlayerSession 처리 - 2) FastArraySerializer의 사용 (0) | 2026.07.16 |