

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Unreal용 플러그인: 관리형 컨테이너 플릿에 게임 배포
<a name="unreal-plugin-container"></a>

이 안내 플러그인 워크플로를 사용하여 게임 서버의 컨테이너 이미지를 생성하고 컨테이너 기반 호스팅 솔루션에 배포합니다. 게임 코드를 아직 통합하지 않은 경우 [Unreal용 플러그인: 게임 코드 통합](unreal-plugin-integrate.md) 섹션을 참조하세요. 이 워크플로를 성공적으로 완료하면 컨테이너화된 게임 서버가 클라우드에서 실행되며 플러그인을 사용하여 게임 클라이언트를 시작하고, 게임 세션에 연결하며, 게임을 플레이할 수 있습니다.

## 시작하기 전에
<a name="unreal-plugin-container-prereqs"></a>

이 워크플로는 다음 작업을 완료했다고 가정합니다.
+ **Amazon GameLift Servers Server SDK를 게임 서버 코드에 통합합니다.** 호스팅하는 게임 서버는 새 게임 세션을 시작하고 게임 세션 상태를 보고하라는 요청에 응답할 수 있도록 Amazon GameLift Servers 서비스와 통신할 수 있어야 합니다. 이 작업을 완료하지 않은 경우 먼저 플러그인 워크플로우인 Anywhere로 호스팅을 따르는 것이 좋습니다. 게임 서버 코드 준비에 대한 지침은 [게임 서버 코드 업데이트](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-server) 섹션을 참조하세요. 관리형 컨테이너 플릿의 경우 게임을 서버 SDK 버전 5.2 이상과 통합해야 합니다.
**참고**  
스타트업 게임 맵을 사용하는 경우 이 작업이 이미 완료되었습니다.
+ **Linux에서 실행할 게임 서버 실행 파일을 패키징합니다.** Windows에서 개발하고 C\$1\$1 서버 SDK 버전 5.2.x 이하 버전을 통합하는 경우 [Unreal 크로스 컴파일 툴킷](http://cross-compile toolkit for your UE version)으로 작업해야 합니다. 또는 별도의 Linux 워크스페이스를 설정하거나 Linux용 Windows 하위 시스템(WSL)과 같은 도구를 사용할 수 있습니다.
+ **게임 서버 빌드와 함께 배포할 파일을 수집합니다.** 로컬 시스템에서 작업 디렉터리를 생성하여 파일을 구성합니다. 해당 파일은 게임 서버 컨테이너 이미지로 구축됩니다. 여기에는 게임 종속성, 컨테이너 시작 시 게임 서버 및 기타 프로세스를 실행하는 스크립트 등을 포함할 수 있습니다.
+ **게임 서버 빌드를 위해 OpenSSL 라이브러리 파일을 추가합니다.** 게임 서버가 서버 SDK 5.3 이상과 통합된 경우 이 단계를 건너뛸 수 있습니다.

  OpenSSL 라이브러리를 수동으로 찾아 `<YourGame>/Binaries/Win64`의 게임 빌드 패키지 디렉터리에 복사합니다. Unreal Engine 5 버전에서 사용하는 것과 동일한 OpenSSL 버전을 **반드시** 사용해야 합니다. 잘못된 OpenSSL 라이브러리와 함께 배포된 게임 빌드는 Amazon GameLift Servers 서비스와 통신할 수 없습니다.

  OpenSSL 라이브러리를 찾으려면 게임 엔진 소스를 검색합니다. 위치는 개발 환경에 따라 다릅니다.

  Windows의 경우: 
  + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
  + `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

  Linux의 경우:
  + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
  + `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`
+ **Amazon GameLift Servers를 사용한 게임 클라이언트 코드를 통합합니다.** 이 작업을 완료하는 한 가지 방법은 이미 통합된 샘플 자산(플러그인에 포함됨)을 추가하는 것입니다. 게임 클라이언트 코드 준비에 대한 지침은 [클라이언트 게임 맵 통합](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-client) 섹션을 참조하세요.
+ **로컬 컴퓨터에 Docker를 설치합니다.** 플러그인이 컨테이너 이미지를 생성하여 ECR 리포지토리로 푸시하도록 하려면 이 도구를 설치해야 합니다. 또는 이러한 작업을 수동으로 수행하고 플러그인에 기존 컨테이너 이미지를 사용하도록 지시할 수 있습니다. 이미지를 수동으로 빌드하는 방법에 대한 자세한 내용은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-prepare-images.html)를 참조하세요.

**Amazon GameLift Servers 관리형 컨테이너 워크플로를 시작하려면:**
+ Unreal 편집기 기본 도구 모음에서 Amazon GameLift Servers 메뉴를 선택하고 **관리형 컨테이너**를 선택합니다. 이 작업을 수행하면 **관리형 컨테이너가 있는 호스트** 플러그인 페이지가 열립니다. 이 페이지는 게임 서버 빌드로 컨테이너 이미지를 생성하고, 컨테이너 플릿에 배포하며, 게임을 시작하는 단계별 프로세스를 제공합니다.

## 0단계: 프로필 설정
<a name="unreal-plugin-container-profile"></a>

이 섹션에는 현재 선택한 사용자 프로필이 표시됩니다. 현재 사용자 프로필이 이 워크플로에 사용할 프로필인지 확인합니다. 이 워크플로에서 생성하는 모든 리소스는 프로필의 AWS 계정과 연결되며 프로필의 기본 AWS 리전에 배치됩니다. 프로필 사용자의 권한에 따라 AWS 리소스 및 작업에 대한 액세스 권한이 결정됩니다.

다음과 같은 경우 선택한 사용자 프로필을 수정해야 할 수 있습니다.
+ 현재 선택된 프로필이 없습니다.
+ 다른 프로필을 선택하거나 새 프로필을 생성하려고 합니다.
+ 선택한 프로필을 부트스트랩해야 합니다(부트스트랩 상태가 비활성인 경우).

**선택한 사용자 프로필을 설정하거나 변경하려면**
+ Amazon GameLift Servers 메뉴에서 ** AWS 액세스 자격 증명 열기를** 선택합니다.

## 1단계: 컨테이너 준비 상태 평가
<a name="unreal-plugin-container-assess"></a>

게임 서버를 컨테이너 플릿에 배포하기 전에 컨테이너 이미지에 패키징하고 Amazon ECR 리포지토리에 저장해야 합니다. 플러그인은 이러한 작업을 사용자를 대신하여 완료할 수 있으며 이러한 작업을 수동으로 수행할 수 있습니다. 이 단계에서는 컨테이너 이미지 및 ECR 리포지토리의 상태에 대한 정보를 제공합니다.

평가 질문을 사용하여 플러그인에 수행해야 할 단계를 알려줍니다.
+ **새 컨테이너 이미지를 생성합니다.** 이 옵션을 선택하면 다음 단계에서 게임 서버 빌드 디렉터리의 위치와 빌드 실행 파일을 묻는 메시지가 표시됩니다. 플러그인은 Dockerfile 템플릿(Amazon GameLift Servers에서 제공)을 사용하고 게임에 맞게 자동으로 구성합니다. [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 템플릿을 확인할 수 있습니다. 이 옵션을 선택한 후 플러그인이 새 이미지를 저장할 위치를 지정합니다.
  + 새 Amazon ECR 리포지토리를 생성하고 여기에 컨테이너 이미지를 푸시합니다. 플러그인은 선택한 사용자 프로필 AWS 리전 에서 AWS 계정 및 기본값을 사용하여 프라이빗 ECR 리포지토리를 생성합니다.
  + 이전에 생성된 Amazon ECR 리포지토리에 컨테이너 이미지를 푸시합니다. 이 옵션을 선택하면 다음 단계에서 목록에서 기존 Amazon ECR 리포지토리를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.
+ **기존 컨테이너 이미지를 사용합니다.** 이미지를 수동으로 빌드한 경우 Amazon GameLift Servers에서 제공하는 Dockerfile 템플릿을 사용하는 것이 좋으며, 이 템플릿은 [Amazon GameLift Servers용 컨테이너 이미지 빌드](containers-prepare-images.md)에서 사용할 수 있습니다. 이 옵션을 선택한 후 이미지의 위치를 지정합니다.
  + 로컬에 저장된 Docker 생성 이미지입니다. 이 옵션을 선택하면 플러그인이 새 Amazon ECR 프라이빗 리포지토리를 생성하고 로컬 이미지 파일을 푸시합니다. 다음 단계에서는 플러그인이 이미지 파일을 찾는 데 사용하는 이미지 ID를 묻는 메시지가 표시됩니다.
  + Amazon ECR 리포지토리에 이미 저장된 컨테이너 이미지입니다. 이 옵션을 선택하면 다음 단계에서 목록의 기존 Amazon ECR 리포지토리 및 이미지를 선택하라는 메시지가 표시됩니다. 목록에는 선택한 사용자 프로필의 AWS 계정 및 기본값 AWS 리전 에 대한 모든 Amazon ECR 리포지토리가 포함됩니다. 퍼블릭 또는 프라이빗 리포지토리를 선택할 수 있습니다.

## 2단계: 이미지 배포 구성
<a name="unreal-plugin-container-configure"></a>

이 단계에서는 플러그인이 컨테이너 플릿에 컨테이너 이미지를 배포하는 데 필요한 정보를 제공합니다. 이 단계에서는 다음 정보를 요청합니다.
+ 1단계에서 선택한 항목을 기반으로 한 게임 서버 빌드, 컨테이너 이미지 또는 Amazon ECR 리포지토리의 위치입니다.
+ 관리형 컨테이너 배포에 사용할 시나리오입니다.
+ 클라이언트 구성 출력 경로입니다. 클라이언트 빌드에서 AWS 구성이 포함된 폴더를 선택합니다. 다음 위치에서 찾습니다. `[client-build]/[project-name]/Content/CloudFormation` 
+ 선택적 배포 설정. 이 섹션에는 플러그인이 기본적으로 사용하는 구성 설정이 있습니다. 이를 수정하거나 기본값을 유지할 수 있습니다.
  + 기본적으로 게임 이름은 게임 프로젝트 이름으로 설정됩니다. 플러그인이 생성하는 모든 AWS 리소스는 게임 이름 값을 참조합니다.
  + 포트 범위, 메모리 제한, vCPU 제한은 컨테이너 플릿의 구성 설정입니다. 이러한 값을 사용자 지정하는 방법에 대한 자세한 내용은 연결 포트 범위는 [네트워크 연결 구성](containers-design-fleet.md#containers-custom-network) 섹션을 참조하고 리소스 제한은 [리소스 제한 설정](containers-design-fleet.md#containers-design-fleet-limits) 섹션을 참조하세요.
  + 컨테이너 이미지 태그는 Amazon ECR에서 컨테이너 이미지를 분류하는 데 사용됩니다. 기본값은 `unreal-gamelift-plugin`입니다.
  + Amazon ECR 리포지토리의 이름입니다. 플러그인이 ECR 리포지토리를 생성하는 경우에만 사용자 지정 이름을 제안하도록 이 필드를 편집할 수 있습니다. 기본값은 `unreal-game lift-plugin-ecr-repository`입니다.

### 배포 시나리오 옵션
<a name="unreal-plugin-container-configure-scenarios"></a>

#### 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c19c39c13b7b3b1"></a>

이 시나리오에서는 게임 서버를 단일 컨테이너 플릿에 배포합니다. 이는 AWS 및 컨테이너 구성과의 서버 통합을 테스트하기 위한 좋은 시작점입니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `CreateGameSession()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.

#### FlexMatch가 있는 단일 리전 컨테이너 플릿
<a name="w2aab9c11b9c19c39c13b7b3b3"></a>

이 시나리오에서는 게임 서버를 컨테이너 플릿에 배포하고, 게임 세션 배치를 구성하며, FlexMatch 매치메이킹을 설정합니다. 이 시나리오는 호스팅 솔루션용 사용자 지정 매치메이커 설계를 시작할 준비가 되었을 때 유용합니다. 이 시나리오를 사용하여 이 솔루션의 기본 리소스를 만들고 필요에 따라 나중에 사용자 지정할 수 있습니다. 다음과 같은 리소스를 배포합니다.
+ Amazon GameLift Servers 컨테이너 그룹 정의는 컨테이너 플릿에서 컨테이너 이미지를 배포하고 실행하는 방법을 설명합니다.
+ 별칭을 사용하여 게임 서버 컨테이너가 설치되고 실행 중인 Amazon GameLift Servers 컨테이너 플릿(온디맨드).
+ FlexMatch 매치메이킹 구성 및 매치메이킹 규칙은 플레이어 요청을 수락하고 매치를 구성하도록 설정.
+ Amazon GameLift Servers 게임 세션 대기열은 (실행 가능성, 비용, 플레이어 지연 시간 등을 기반으로) 가능한 최상의 호스팅 리소스를 찾고 게임 세션을 시작하여 제안된 매치에 대한 요청을 충족시켜 줌.
+ 플레이어가 게임을 인증하고 시작할 수 있는 Amazon Cognito 사용자 풀 및 클라이언트.
+ 사용자 풀을 API와 연결하는 API 게이트웨이 권한 부여자.
+ API Gateway에 대한 과도한 플레이어 호출을 스로틀링하기 위한 웹 액세스 제어 목록(ACL).
+ 게임 세션을 요청하고 게임에 참여하는 등 게임 클라이언트를 대신하여 Amazon GameLift Servers 서비스에 요청하는 백엔드 서비스: 
  + 플레이어가 게임 세션 슬롯을 요청할 수 있는 API Gateway \$1 Lambda 함수. 이 함수는 슬롯이 확보되지 않는 경우 `StartMatchmaking()`을 호출합니다.
  + 플레이어가 게임 요청에 대한 연결 정보를 얻을 수 있는 API Gateway \$1 Lambda 함수.
+ 플레이어용 매치메이킹 티켓과 게임 세션 정보를 저장하는 DynamoDB 테이블.
+ GameSessionQueue 이벤트를 처리하는 Amazon SNS 주제 \$1 Lambda 함수.

## 컨테이너 플릿 배포
<a name="unreal-plugin-container-deploy"></a>

플릿 구성이 완료되면 **컨테이너 플릿 배포** 버튼을 선택하여 배포를 시작합니다. 플러그인이 컨테이너 이미지를 생성하여 ECR에 푸시하고, 컨테이너 플릿에 대한 호스팅 리소스를 프로비저닝하며, 선택한 호스팅 솔루션 시나리오에 대해 플릿 및 기타 AWS 리소스를 배포하는 동안 이 프로세스는 몇 분 정도 소요될 수 있습니다.

배포를 시작하면 각 단계의 진행 상황을 추적할 수 있습니다. 구성에 따라 단계에 다음이 포함될 수 있습니다.
+ 컨테이너 이미지 구성
+ Amazon ECT 리포지토리 생성 
+ 이미지 빌드 및 Amazon ECR로 푸시
+ 컨테이너 그룹 정의 생성
+ 컨테이너 플릿 생성

자세한 배포 정보를 보려면 ** AWS Management Console에서 보기**를 선택합니다. 컨테이너 플릿이 활성 상태에 도달하면 플릿은 게임 세션을 호스팅할 준비가 된 서버 프로세스로 컨테이너를 적극적으로 실행하고 있습니다.

배포가 완료되면 게임 세션을 호스팅하고 플레이어 연결을 수락할 준비가 된 작동 컨테이너 플릿이 있습니다.

진행 중인 배포는 중지할 수 없습니다. 배포가 잘못된 상태가 되거나 실패하는 경우 **배포 재설정** 옵션을 사용하여 다시 시작할 수 있습니다.

## 클라이언트 시작
<a name="unreal-plugin-container-launch"></a>

이제 Amazon GameLift Servers로 호스팅된 멀티플레이어 게임을 시작하고 플레이하는 데 모든 작업을 완료했습니다. 게임을 플레이하려면 **클라이언트 시작**을 선택하여 게임 클라이언트의 로컬 인스턴스를 시작합니다.
+ 단일 플릿 시나리오를 배포한 경우 한 명의 플레이어가 있는 게임 클라이언트의 하나의 인스턴스를 열고 서버 맵을 입력하여 이동할 수 있습니다. 또한 게임 클라이언트의 두 번째 인스턴스를 열어 동일한 서버 게임 맵에 두 번째 플레이어를 추가할 수 있습니다.
+ FlexMatch 시나리오를 배포한 경우 호스팅 솔루션은 두 개 이상의 게임 클라이언트가 매치메이킹 요청을 할 때까지 기다립니다. 플레이어 한 명과 함께 게임 클라이언트의 인스턴스를 두 개 이상 엽니다. 두 플레이어가 매칭되고 매치를 위해 게임 세션에 참여하라는 메시지가 표시됩니다.

## 컨테이너 플릿 업데이트
<a name="unreal-plugin-container-update"></a>

관리형 컨테이너 호스팅 솔루션을 성공적으로 배포한 경우 **배포 업데이트** 기능을 사용할 수 있습니다. 이 옵션을 사용하면 새 플릿을 생성할 필요 없이 배포된 컨테이너 플릿의 구성 설정을 업데이트할 수 있습니다.

배포를 업데이트할 때 다른 게임 서버 빌드로 컨테이너 이미지를 배포하고, Amazon ECR 리포지토리를 변경하며, 다른 배포 시나리오를 선택하고, 선택적 구성 설정을 사용자 지정할 수 있습니다.

변경사항을 배포할 준비가 되면 업데이트를 선택합니다. 배포 업데이트에 필요한 시간은 전체 배포와 유사합니다. 자세한 배포 정보를 보려면 ** AWS 관리 콘솔에서 보기를** 선택합니다.

## 배포된 리소스를 정리합니다.
<a name="unreal-plugin-container-cleanup"></a>

더 이상 필요하지 않은 관리형 컨테이너 솔루션의 AWS 리소스를 정리하는 것이 가장 좋습니다. 리소스를 제거하지 않으면 이러한 리소스에 대한 비용이 계속 발생할 수 있습니다.

다음 리소스를 삭제합니다.
+ 관리형 컨테이너 리소스 스택. 이 스택의 리소스는 선택한 배포 시나리오에 따라 달라집니다. 전체 스택을 삭제하려면 CloudFormation 콘솔을 사용합니다. Amazon GameLift Servers 플러그인에서 생성된 스택은 다음 명명 규칙을 사용합니다. `GameLiftPluginForUnreal-{GameName}-Containers`. 플러그인에서 새 관리형 컨테이너 배포를 시작하기 전에 스택 삭제 프로세스가 완료될 때까지 기다립니다. 자세한 내용은 [CloudFormation 콘솔에서 스택 삭제](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)를 참조하세요.
+ Amazon ECR 리포지토리. 플러그인을 사용하여 컨테이너 이미지에 대한 리포지토리를 생성한 경우 더 이상 필요하지 않은 저장소는 삭제하는 것이 좋습니다. 관리형 컨테이너 배포를 재설정하기 전에는 리포지토리를 삭제할 필요가 없습니다. 배포를 업데이트하거나 재설정하면 플러그인은 다른 리포지토리를 사용하도록 지시되지 않는 한 동일한 리포지토리를 자동으로 사용합니다. 자세한 내용은 [Amazon ECR에서 프라이빗 리포지토리 삭제](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-delete.html)를 참조하세요.