728x90
반응형
- 개요
FindOrCreateGameSession 람다에서 반환된 GameSession들의 상세정보를 활용하여
동작중인 GameSession이 없다면 새로운 GameSession을 생성하는 기능을 추가한다
해당 기능은 CreateGameSessionCommand API를 사용하여 수행한다
- 절차

FindOrCreateGameSession 람다에 적용한 정책을 위와 같이 수정한다
GameLift Servers 서비스의 CreteGameSession API를 사용할 수 있도록 추가한다
import {GameLiftClient, ListFleetsCommand, DescribeFleetAttributesCommand, DescribeGameSessionsCommand, CreateGameSessionCommand} from "@aws-sdk/client-gamelift";
export const handler = async (event) => {
const gameLiftClient = new GameLiftClient({region : process.env.REGION});
try {
const listFleetsInput = {
Limit: 10
};
const listFleetsCommand = new ListFleetsCommand(listFleetsInput);
const listFleetsResponse = await gameLiftClient.send(listFleetsCommand);
const fleetIds = listFleetsResponse.FleetIds;
const describeFleetAttributesInput = {
FleetIds : fleetIds,
Limit: 10
};
const describeFleetAttributesCommand = new DescribeFleetAttributesCommand(describeFleetAttributesInput);
const describeFleetAttributesResponse = await gameLiftClient.send(describeFleetAttributesCommand);
const fleetAttributes = describeFleetAttributesResponse.FleetAttributes;
let fleetId;
for (const fleetAttribute of fleetAttributes){
if(fleetAttribute.Status === "ACTIVE"){
fleetId = fleetAttribute.FleetId;
break;
}
}
const describeGameSessionsInput = {
FleetId : fleetId,
Limit : 10,
Location : "custom-Home-LocalPC", // 테스트용 Anywhere 로케이션(추후 EC2 Managed 로케이션으로 수정)
StatusFilter : "ACTIVE"
};
const describeGameSessionsCommand = new DescribeGameSessionsCommand(describeGameSessionsInput);
const describeGameSessionsResponse = await gameLiftClient.send(describeGameSessionsCommand);
const gameSessions = describeGameSessionsResponse.GameSessions;
let gameSession;
for (const session of gameSessions) {
if (session.CurrentPlayerSessionCount < session.MaximumPlayerSessionCount && session.PlayerSessionCreationPolicy === "ACCEPT_ALL") {
gameSession = session;
break;
}
}
if (gameSession) {
// 동작중인 GameSession이 탐색됨
} else {
// GameSession이 존재하지 않음 -> 새로 생성
const createGameSessionInput = {
GameProperties: [
{
Key: "difficulty", // 게임 난이도 - 초보자로 설정
Value: "novice",
},
],
FleetId: fleetId,
MaximumPlayerSessionCount: 20,
Location: "custom-Home-LocalPC" // 테스트용 Anywhere 로케이션(추후 EC2 Managed 로케이션으로 수정)
};
const createGameSessionCommand = new CreateGameSessionCommand(createGameSessionInput);
const createGameSessionResponse = await gameLiftClient.send(createGameSessionCommand);
gameSession = createGameSessionResponse.GameSession;
}
return gameSession;
} catch(error){
return error;
}
};
이후 람다의 코드를 위와 같이 수정한다
수정 사항은 다음과 같다
- DescribeGameSessionsCommand API 실행 결과에서 GameSession 정보가 담긴 배열을 gameSessions 변수에 저장
- gameSessions 변수를 순회하면서 플레이어가 바로 들어갈 수 있으면 gameSession 변수에 저장
- 다음의 조건에 따라 다르게 동작
- GameSession이 탐색됨 : 로직을 아직 작성하지 않음
- GameSession이 탐색되지 않음 : CreateGameSessionCommand API를 사용하여 최대 20명이 들어갈 수 있는 새로운 GameSession을 생성
- 이후 gameSession 변수 반환
- 실행
# 1) 토큰 발급
aws gamelift get-compute-auth-token ^
--fleet-id "플릿 ID" ^
--compute-name "컴퓨팅 자원 이름" ^
--region "사용중인 리전" ^
--profile "프로필 이름" // 해당 옵션은 필요한 경우 사용
# 2) 발급된 토큰을 사용하여 서버 exe 파일 실행
"경로\Build\Build_1\운영체제Server\프로젝트Server.exe" -log -glAnywhere ^
-glAnywhereAuthToken="발급된토큰" ^
-glAnywhereHostId="컴퓨팅 자원 이름" ^
-glAnywhereFleetId="플릿 ID" ^
-glAnywhereWebSocketUrl="리전에 따른 소켓 URL" ^
-port=7777 // 기본 포트번호
위와 같이 AWS CLI에 입력하여 서버의 exe 파일을 실행한다

exe 파일 실행 후에 Lambda 함수를 실행하면 위와 같이 Game Session이 활성 상태인 것을 확인할 수 있다
728x90
반응형
'언리얼 엔진 - 게임 프로젝트 > AWS GameLift를 활용한 데디케이트 FPS 프로젝트' 카테고리의 다른 글
| Game Sessions - 최종) 서버로부터 반환된 CreateGameSessionCommand API 실행 결과 파싱 (0) | 2026.05.23 |
|---|---|
| Game Sessions - 5) UI를 통한 GameSession 생성 (0) | 2026.05.22 |
| Game Sessions - 3) 플릿 ID 상세정보 순회 + GameSession 상세 정보 조회 (0) | 2026.05.22 |
| Game Sessions - 2) 포탈 UI의 구조 설계 (0) | 2026.05.21 |
| Game Sessions - 1) GameSession 탐색 및 생성 (0) | 2026.05.21 |