亚马逊AWS官方博客

Amazon GameLift 高阶使用技巧(二)- 使用 GameLift Container Fleet 运行 UE5 Dedicated Server

前言

在快速发展的游戏行业中,游戏服务器的部署和维护一直是开发团队面临的重要挑战。随着容器技术的成熟,将 Unreal Engine 专用服务器容器化部署到 Amazon GameLift 平台上,已经成为一种高效且可靠的解决方案。这种方案不仅简化了部署流程,还提供了更好的资源隔离和扩展性能。

本文将详细介绍如何利用 Amazon GameLift 的容器 Fleet 来部署和管理 Unreal Engine5 经典 Demo 游戏 Lyra Game 的专用服务器。通过容器化部署,我们可以实现环境一致性、快速部署、自动扩展等优势。同时,Amazon GameLift 强大的管理功能,如会话管理、自动伸缩、监控告警等,能够帮助开发团队更好地维护游戏服务质量,为玩家提供稳定的游戏体验。另外,目前 GameLift 已经支持 Graviton3 的机型,进一步为用户带来更高的性价比。本文将带大家完成 UE5 Dedicated Server 部署到 Graviton based Container Fleet 的流程。

环境准备

环境部署

编译适合 GameLift Managed Container 的游戏包

目前 GameLift Managed Container 的 SDK 版本为 5.2.0+,所以我们需要重新基于 5.2.0 版本进行构建游戏包。

1. 将 GameLift-Cpp-ServerSDK-5.2.0 重新进行编译

sudo yum install git docker -y
git clone https://github.com/aws/amazon-gamelift-toolkit.git 
cd amazon-gamelift-toolkit/building-gamelift-server-sdk-for-unreal-engine-and-amazon-linux

2. Dockerfile 请使用以下内容

FROM public.ecr.aws/amazonlinux/amazonlinux:latest as build-server
# Install dependencies
RUN yum install -y gcc-c++ gdb cmake3 git wget openssl openssl-devel tar perl sudo

# Install correct OpenSSL version. NOTE: You might need to change this based on your Unreal Engine 5 version and the OpenSSL version it utilizes
RUN wget https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1t.tar.gz && \
tar -xzvf OpenSSL_1_1_1t.tar.gz && \
cd openssl-OpenSSL_1_1_1t/ && \
./config && \
sudo make install && \
mkdir lib && \
cp libssl.so.1.1 /lib && \
cp libcrypto.so.1.1 /lib

RUN export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64 && \
openssl version && \
cd ..

# Copy the Open SSL files to binaries folder
RUN mkdir /binaries && \
cp ./openssl-OpenSSL_1_1_1t/libssl.so.1.1 /binaries/ && \
cp ./openssl-OpenSSL_1_1_1t/libcrypto.so.1.1 /binaries/

# Download and build the GameLift Server SDK (NOTE: You might need to change this to download a different SDK version)
RUN echo "Download and unzip GameLift Server SDK 5.2.0" && \
mkdir SDK && cd SDK && \
wget https://gamelift-server-sdk-release.s3.us-west-2.amazonaws.com/cpp/GameLift-Cpp-ServerSDK-5.2.0.zip && \
unzip GameLift-Cpp-ServerSDK-5.2.0.zip && \
echo "Build the GameLift server SDK" && \
mkdir cmake-build && \
export OPENSSL_ROOT_DIR=/openssl-OpenSSL_1_1_1t/ && \
export OPENSSL_LIBRARIES=/openssl-OpenSSL_1_1_1t/lib/ && \
cmake -G "Unix Makefiles" -DBUILD_FOR_UNREAL=1 -DCMAKE_BUILD_TYPE=Release -S . -B ./cmake-build && \
cmake --build cmake-build --target all && \
cd ./cmake-build/prefix/ && \
echo "Copying files over to binaries folder" && \
cp -r ./lib/*  /binaries/ && \
echo "copying over headers (these are already provided by the GameLift Unreal Plugin so you don't need them with that)" && \
mkdir /binaries/include && \
cp -r ./include/*  /binaries/include/

# Copy the binaries only to a clean setup for copying to local system after build
FROM scratch AS server
  COPY --from=build-server /binaries/ /
  ENTRYPOINT [ "/GameLiftSampleServer" ]

3. 执行命令,获取编译包

sudo ./buildbinaries.sh

执行完毕后,下载 AL2023GameliftUE5sdk.zip 至 Windows 机器上。

4. 在官方网站下载 5.2.0 的 Unreal Engine Plugin 文件至 Windows 机器上。删除原有 C:\Unreal Projects\LyraStarterGame\Plugins 下 GameLiftServerSDK Plugin文件,并将最新 Plugin 文件拷贝进去

5. 将编译好的文件存放到 LyraStarterGame\Plugins\GameLiftServerSDK\ThirdParty\GameLiftServerSDK\LinuxArm64\x86_64-unknown-linux-gnu,如果文件夹不存在,请自行创建

6. 将 Project 重新 Build Solution 后,打开 UE Editor, Cook Development Server

构建镜像

1. 首先在 ECR 上创建存储容器镜像

aws ecr create-repository --repository-name gamelift-ue5-arm64

2. 然后将已经打好的 Linux Arm64 的包上传至上面创建的 EC2 上

4. 解压 linuxarm64.zip 的打包后,我们在文件目录下创建 Dockerfile 文件

cd linuxarm64

cat << 'EOF' > Dockerfile
FROM amazonlinux:2023

# Create a working directory
WORKDIR /app

# Copy all files from current directory to container
COPY . .

# Make the shell script executable
RUN chmod +x LyraServer-Arm64.sh

# Set the entrypoint
ENTRYPOINT ["./LyraServer-Arm64.sh"]
EOF

4. 打包镜像,并且 push 至 ECR 上

docker build -t gamelift-ue5-arm64 .
docker tag gamelift-ue5-arm64:latest {accountid}.dkr.ecr.{region}.amazonaws.com/gamelift-ue5-arm64:latest
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {accountid}.dkr.ecr.{region}.amazonaws.com
docker push {accountid}.dkr.ecr.{region}.amazonaws.com/gamelift-ue5-arm64:latest

配置 GameLift Container group definitions

Amazon GameLift 的 Container group definitions 是一个配置蓝图,用于定义如何将容器化游戏服务器部署到容器机群中,包含游戏服务器容器和支持容器的配置信息。它支持两种类型:GAME_SERVER 和 PER_INSTANCE,可以指定内存、CPU 等资源限制,并且允许维护多个版本。

GAME_SERVER 容器组用于运行游戏服务器应用程序,是托管游戏会话和玩家的必需组件。它可以在 Fleet 实例中复制多份,复制数量取决于软件的计算需求和实例可用资源.

PER_INSTANCE 容器组是可选的,用于在每个 Fleet 实例上运行额外的支持软件,比如监控或后台服务。游戏服务器软件不直接依赖于 PER_INSTANCE 组中的进程。

本文主要是测试 Game Server 的内容,我们首先创建 Group Definitions。

打开 AWS Console

创建 Container Group Definition 完成。

配置 GameLift  Managed Container Fleet

下面我们依据上面的 Container Definition Group 来创建 Managed Container Fleet,打开 AWS Console

1. 因为在 Fleet 中我们需要将日志保存到 S3 中,所以我们需要创建一个 Fleet Role 绑定到 GameLift Fleet

2. 创建日志存储桶,命名格式为 gamelift-*

3. 创建 Fleet,并选择日志存储方式为到 S3 中

选择 C7g 实例

Review,然后提交创建。

等待几分钟之后,我们会看到 Container Fleet 的状态变为 Active

同时在日志中,我们可以发现以下日志信息,表示 GameLift 初始化成功

连接测试

创建 GameSession

1. 使用以下 AWS Cli 命令来创建 Game Session

aws gamelift create-game-session \
  --fleet-id <containerfleet-id> \
  --maximum-player-session-count 2

2. 使用命令连接 Game Session,注意 IP 和端口请根据上图的内容来进行替换

LyraClient.exe <IP>:32806 -WINDOWED -ResX=800 -ResY=450

至此我们使用 Graviton 容器的方式来部署 UE5 的 Dedicated Server 流程就完毕了。

总结

通过将 Unreal Engine 5 专用服务器容器化并部署到 Amazon GameLift 的 Container Fleet,开发团队能够实现高效、灵活的游戏服务器管理。本文详细介绍了从环境准备到构建镜像及配置 GameLift Managed Container Fleet 的完整流程,涵盖了以下关键点:

  • 环境准备:了解构建 UE5 Linux Arm 包的要求,并配置适合的 EC2 实例和 Docker 环境。
  • 游戏包编译:通过安装必要的依赖项和使用 GameLift Server SDK,成功编译适合 GameLift Managed Container 的游戏包。
  • 镜像构建与推送:创建 ECR 仓库,构建 Docker 镜像并将其推送至 Amazon ECR,实现游戏服务器的容器化。
  • Fleet 配置:配置 Container Group Definitions 和 Managed Container Fleet,确保游戏服务器能够在 AWS 环境中高效运行。
  • 连接测试:通过创建 Game Session 并连接客户端,验证服务器部署的成功性。

这种容器化部署方案不仅简化了游戏服务器的管理流程,还提供了更好的资源利用率和扩展能力,使开发团队能够专注于提升玩家体验。借助 Amazon GameLift 强大的功能,团队可以更好地维护游戏服务质量,确保稳定的在线游戏体验。

系列博客

Amazon GameLift 高阶使用技巧(一)- FlexMatch 多模式匹配的实现

本篇作者

郭俊龙

亚马逊云科技解决方案架构师,主要负责游戏行业客户解决方案设计,比较擅长云原生微服务以及大数据方案设计和实践。