亚马逊AWS官方博客

Amazon GameLift 从入门到精通(二)拆解游戏接入 Gamelift 三大步骤

在当今竞争激烈的游戏市场中,稳定、可靠且具有成本效益的服务器基础设施对游戏成功至关重要。Amazon GameLift 为游戏开发者提供了强大的托管解决方案,可以简化多人游戏服务器的部署和管理。在《Amazon GameLift 从入门到精通(一)核心组件详解》中,我们讨论了 GameLift 的核心架构设计和核心组件,本文将继续基于开发者视角,深入探讨 GameLift 工具集的三大核心内容:SDK 集成、CLI 自动化部署以及可观测性。

1. SDK 集成 – 理解游戏服务器生命周期

成功实施 Amazon GameLift 的首要步骤是理解并正确集成其 SDK。

1.1 如何理解 GameLift SDK

下图是 GameLift 的交互时序图,展示了游戏各组件之间通过 SDK 进行交互方式,使得 Amazon GameLift 能够根据玩家需求动态启动游戏会话,并实时监控游戏服务器的可用状态。

1.1.1 GameLift 生态服务组件

  • 游戏客户端(Game Client):通常是游戏引擎 unity/unreal 打包出来的二进制文件。
  • 游戏后端服务(Backend Service):即平台服,需要集成 Service API 也就是图中的 SDK 和 GameLift Endpoint 交互。
  • 游戏服务器(Game Server):即战斗服,需要集成 Server SDK 和 GameLift Endpoint 交互。
  • GameLift Endpoint(GameLift):托管在 AWS 上的服务。

这里可以看到,游戏后端服务和游戏服务器两者需要接入不同的 SDK。

1.1.2 游戏会话生命周期的 5 个步骤

  1. 游戏服务器初始化(Initialize game server):游戏包上传之后,GameLift Endpoint 调用 Fleet 配置资源启动游戏进程以准备接收玩家。游戏进程启动后,游戏服务器通过 InitSDK 方法通知 GameLift Endpoint 已准备就绪可以托管游戏会话。同时会定期实施健康检查机制保持活跃状态,通过心跳包向 GameLift Endpoint 报告其运行状态,确保系统能够及时发现并替换异常的游戏服务器节点。
  2. 创建游戏会话(Create game session):游戏后端服务会接收并处理来自玩家的房间请求,随后向 GameLift Endpoint 发送 StartGameSessionPlacement 请求,GameLift 根据当前可用资源、延迟要求和玩家偏好等因素,智能选择最合适的服务器进程来托管新的游戏会话。一旦会话创建完成,GameLift 会返回包含服务器 IP 地址和端口的连接信息,这些信息随后会被转发给玩家的游戏客户端。
  3. 玩家加入游戏(Add player to game):游戏后端服务器调用 CreatePlayerSession 并提供游戏会话 ID,GameLift 验证会话存在且有可用容量后,生成唯一的玩家会话 ID 作为进入房间的凭证。游戏服务器会验证这一凭证,确保只有经过授权的玩家才能连接到游戏会话,有效防止未经授权的访问,同时为服务器提供玩家身份信息。
  4. 玩家离开游戏(Remove player):玩家结束游戏时,游戏服务器会调用 RemovePlayerSession 清除玩家会话缓存信息并更新状态,使 GameLift 能够准确追踪会话中的活跃玩家数量,为新玩家加入做好准备或判断会话是否可以结束。
  5. 关闭游戏会话(Shut down game session):所有玩家离开后,游戏服务器在 ProcessEnding 方法中执行收尾工作,如统计分数、存储日志等。GameLift 随后会回收这些资源,并将服务器进程重置为可用状态,准备托管新的游戏会话,从而完成完整的生命周期循环。

GameLift 游戏会话生命周期管理通过 SDK 确保了从游戏会话创建到关闭的每一步都能高效运行,为玩家提供流畅的游戏体验,同时优化了资源的使用效率。

1.2 如何集成 GameLift SDK

GameLift SDK 的集成是实现游戏服务器托管的关键环节,需要分别针对游戏服务器和游戏后端服务进行适当的集成。以下是具体的集成步骤:

1.2.1 游戏服务器 Server SDK 集成

1. 环境准备:

  • 确定游戏服务器开发语言(C++、C#或Go)并下载相应的 GameLift Server SDK
  • 在开发环境中配置 AWS 凭证以确保本地测试的权限

2. 核心集成步骤:

  • 引入 SDK:将 SDK 添加到游戏服务器项目中并正确配置依赖关系
  • 初始化连接:InitSDK() 建立与 GameLift 服务的通信
  • 处理状态回调:实现 onStartGameSessiononProcessTerminate 等回调函数
  • 报告就绪状态:通过 ProcessReady() 告知 GameLift 服务器已准备好接收游戏会话
  • 实现健康检查:定期调用 OnHealthCheck() 汇报服务器状态

3. 验证玩家会话:

// 以C#示例代码为例:验证玩家会话
var validationResponse = GameLiftServerAPI.AcceptPlayerSession(playerSessionId);if (validationResponse.Success)
{
    // 允许玩家连接
}else
{
    // 拒绝未授权的玩家
}

1.2.2 游戏后端服务 SDK 集成

1. 准备工作:

  • 选择适合后端服务的 AWS SDK(如 Java、.NET、Python 等)
  • 配置 IAM 权限以允许调用 GameLift API

2. 核心集成流程:

  • 创建 GameLift 客户端:初始化与 GameLift 服务的连接
  • 实现会话管理:调用 CreateGameSessionStartGameSessionPlacement 创建游戏会话
  • 管理玩家连接:使用 CreatePlayerSession 为玩家分配服务器资源
  • 查询游戏状态:实现 DescribeGameSessions 等 API 监控游戏会话状态

3. 优化匹配体验:

// 以Java示例代码为例:使用FlexMatch创建匹配
CreateMatchmakingConfigurationRequest configRequest = new CreateMatchmakingConfigurationRequest()
    .withName("MyMatchConfig")
    .withRuleSetName("MyRuleSet")
    .withGameSessionQueueNames("MyGameSessionQueue");

amazonGameLiftClient.createMatchmakingConfiguration(configRequest);

对于 Unity 成功集成 SDK 后,接下来需要考虑如何高效部署游戏服务器,这就需要我们了解 CLI 自动化部署的方法。

2. Amazon GameLift CLI:部署 CI/CD 的核心工具

在成功集成 GameLift SDK 后,游戏开发团队面临的下一个关键挑战是服务器部署流程。尽管 AWS 控制台提供了直观的界面操作,但在实际生产环境中,如果能通过实施自动化 CI/CD 部署 GameLift,游戏开发团队能够显著提高交付速度、减少人为错误、增强游戏服务质量,并最终为玩家提供更稳定、更频繁更新的游戏体验。AWS GameLift 命令行接口(CLI)工具应运而生,成为构建自动化部署流水线的基础组件。

2.1 什么是 GameLift CLI

Amazon GameLift CLI 是 AWS Command Line Interface (AWS CLI) 命令行工具里面的一个子命令,专门用于管理 GameLift 游戏服务器托管资源的命令行工具集。通过 aws gamelift 命令前缀提供对服务器部署、Fleet 管理和游戏会话配置等功能的自动化控制。它允许开发团队通过脚本和命令行操作来创建、监控和管理 GameLift 资源,从而实现游戏服务器部署流程的自动化和持续集成。

2.2 GameLift CLI 的优势

游戏服务部署不仅仅是简单的文件上传过程,而是涉及多个 AWS 服务节点的复杂工作流。一个完整的 GameLift 部署流程通常包含以下关键环节:

  • 构建管理(Builds)- 将编译好的游戏服务器包上传至 AWS 存储服务(如 S3),并在 GameLift 中注册为可部署的构建。
  • 服务器队列配置(Fleets)- 将静态构建转化为活跃的服务器进程集群,配置实例类型、扩缩容策略和网络规则。
  • 队列管理(Queues)- 设计玩家请求路由规则,基于延迟、容量和成本等因素智能分配服务器资源。
  • 匹配系统集成(FlexMatch)- 配置玩家匹配逻辑,确保符合游戏设计的玩家组合能够进入同一游戏会话。

*每个环节的更多介绍参考:Amazon GameLift 从入门到精通(一)核心组件详解 。通常情况下,开发人员不会使用 AWS Management Console 来对以上资源来进行创建,而是通过 GameLift CLI 或代码方式来完成这些内容的创建。GameLift CLI 提供了一套跨平台的方法,可以直接通过编写脚本的形式来执行重复性任务,大大提高了开发效率,简化了整个 GameLift 的部署过程。于此同时,Gamelift CLI 底层使用了AWS SDK,因此可以直接访问 GameLift 上的全部功能,对于需要编写自定义逻辑的场景,开发人员可以无缝地将 CLI 和 SDK 结合使用。

2.3 通过 GameLift CLI 部署 GameLift 核心资源的实现

2.3.1 构建管理(Builds)

将编译好的游戏服务器包上传至 AWS 存储服务,并在 GameLift 中注册为可部署的构建。

# 上传并注册游戏服务器构建,参考的demo命令格式
aws gamelift upload-build \
    --name "DeathmatchServer-v1.0" \    #Build的名字
    --build-version "1.0.42" \          #游戏的版本号
    --build-root "./Builds/Linux/Tanks/Server" \    #该游戏的编译后的二进制文件路径
    --operating-system AMAZON_LINUX_2 \ #该游戏运行的操作系统
    --server-sdk-version "5.0.0"        #指定游戏服务器使用的 Amazon GameLift Server SDK 版本

2.3.2 服务器队列配置(Fleets)

将静态构建转化为活跃的服务器进程集群,配置实例类型、扩缩容策略和网络规则。

# 创建服务器队列(Fleet),参考的demo命令格式,build-id 采用上一步创建的Build的Id
aws gamelift create-fleet \
    --name "MainProductionFleet" \                        #Fleet的名称
    --build-id "build-1e1ea73a-23cd-47d3-9596-362e861764e1" \  #采用上一步创建的Build的Id
    --ec2-instance-type "c5.large" \                      #指定Fleet中 EC2 实例的类型
    --fleet-type "ON_DEMAND" \                            #Fleet的计费类型:ON_DEMAND(按需)/SPOT,这里以按需实例为例
    --runtime-configuration "ServerProcesses=[{LaunchPath=/local/game/server.sh,ConcurrentExecutions=10}]" \ #定义游戏服务器进程如何在Fleet实例上运行,LaunchPath里面的路径需要替换成实际的游戏脚本路径
    --ec2-inbound-permissions "FromPort=33435,ToPort=33535,IpRange=0.0.0.0/0,Protocol=UDP"                    #配置允许连接到游戏服务器的网络规则

2.3.3 队列管理(Queues)

设计玩家请求路由规则,基于延迟、容量和成本等因素智能分配服务器资源。

# 创建游戏会话队列,参考的demo命令格式,DestinationArn 采用上一步创建Fleet的Arn
aws gamelift create-game-session-queue \
    --name "GlobalGameQueue" \                         #Queue的名称
    --timeout-in-seconds 600 \                         #超时时间
    --destinations "DestinationArn=arn:aws:gamelift:us-east-1:640168xxxxxxx:fleet/fleet-7ed99243-fa65-4f29-b694-xxxxxxx" \ #目标Fleet,DestinationArn 采用上一步创建Fleet的Arn
    --player-latency-policies "MaximumIndividualPlayerLatencyMilliseconds=50,PolicyDurationSeconds=120" \                  #玩家延迟策略
    --region us-east-1                                 #部署的可用区

2.3.4 匹配系统集成(FlexMatch)

配置玩家匹配逻辑,确保符合游戏设计的玩家组合能够进入同一游戏会话。

# 创建匹配配置,参考的demo命令格式,game-session-queue-arns采用上一步创建的Queues的Arn
aws gamelift create-matchmaking-configuration \
    --name "StandardMatchmakingConfig" \                     #FlexMatch的名称
    --description "Standard 4v4 skill-based matchmaker" \    #描述
    --game-session-queue-arns "arn:aws:gamelift:us-east-1:640168xxxxxxx:gamesessionqueue/GlobalGameQueue" \ #game-session-queue-arns采用上一步创建的Queues的Arn
    --request-timeout-seconds 120 \                          #请求超时时间
    --acceptance-required \                                  #启用匹配接受功能
    --acceptance-timeout-seconds 30 \                        #设置玩家接受匹配的超时时间为 30 秒
    --rule-set-name "BalancedTeamSkillRuleSet" \             #指定用于匹配玩家的规则集名称
    --region us-east-1

而其中 rule-set-name 代表的是规则集的名称,规则集可以通过 aws 的控制台界面去创建,也可以通过命令行创建。

# 例如通过如下命令创建规则集,
aws gamelift create-matchmaking-rule-set \
    --name "BalancedTeamSkillRuleSet" \                  #规则集名称
    --rule-set-body '{                                   #规则Body,需要满足JSON格式,我们简单定义了一个红队和蓝队的规则
      "name": "BalancedTeamSkillRuleSet",
      "ruleLanguageVersion": "1.0",
      "teams": [
        {"name": "Red", "maxPlayers": 4, "minPlayers": 4},
        {"name": "Blue", "maxPlayers": 4, "minPlayers": 4}
      ]
    }‘

规则更详细的语法请参考:https://docs.aws.amazon.com/gamelift/latest/flexmatchguide/match-design-ruleset.html

通过这些 CLI 命令,开发团队能够实现 GameLift 部署流程的自动化和标准化,减少手动操作带来的风险,提高服务质量和部署效率。利用这些命令也可以集成到 CI/CD 流水线中,进一步简化游戏服务器的发布和更新过程。

2.4 案例分析:《星战:银河猎手》的 FleetDeployer

《星战:银河猎手》(Star Wars: Hunters)开发团队在 AWS re:Invent 2024 大会上分享了他们基于 GameLift CLI 打造的自定义部署工具”FleetDeployer”。该团队通过 GameLift 实现了核心的关键功能:一是根据玩家需求自动调整服务器容量,在高峰时段扩容,低谷时段缩容,在资源管理的效率上大幅提升;二是应用匹配逻辑来创造平衡且有趣的玩家体验。

通过 GameLift 使开发者能够专注于游戏开发,而非基础设施管理。为了满足特定需求,Star Wars: Hunters 团队开发了 FleetDeployer 工具,旨在实现三个主要目标:

  1. 允许所有工作室自行将游戏部署到指定环境
  2. 使开发者能够修改所有 GameLift 资源,无需登录 AWS Console
  3. 通过标准化 CI/CD 流程减少人为配置和部署错误

在此架构中,FleetDeployer 作为连接 Web 服务、Hunters-API 与 GameLift 之间的封装层,简化了资源调用和管理流程。

这一成功案例展示了如何将 GameLift CLI 工具转化为适合团队特定工作流的定制化解决方案,成为游戏服务自动化部署的典范实践。值得注意的是,在游戏服务稳定上线后,建立完善的可观测性方案同样是确保游戏长期稳定运行的关键环节。

3. GameLift 可观测性 – 监控与问题排查

游戏上线后,建立完善的可观测性体系至关重要。Amazon GameLift 提供了丰富的可观测性功能,帮助开发者全方位监控游戏服务器的运行状态、性能表现及用户体验。一个完整的 GameLift 可观测性解决方案通常包含三个核心维度:指标、链路追踪和日志。

3.1 关键指标监控

GameLift 提供了丰富的内置指标,可通过 AWS Console 或 CloudWatch 轻松获取和可视化。这些指标覆盖了游戏服务器运行的各个关键方面,其中核心监控指标有:Fleet 资源指标、游戏会话指标、玩家会话指标、游戏服务器进程指标、队列指标、FlexMatch 指标、FleetIQ 指标。一部分指标如图所示,通过通过指标构建监控面板:

GameLift 监控指标在游戏生产环境中提供全面的基础设施可视化,实时反映服务器资源利用率、玩家会话状态和匹配系统性能,助力运营团队快速识别瓶颈和异常。这些指标支持数据驱动的容量规划和自动扩缩决策,平衡运营成本与玩家体验,同时通过预警系统确保关键问题得到及时响应,从而保障游戏服务的高可用性和稳定性。

3.2 链路跟踪

在很多的游戏后端架构中,一个玩家请求通常会跨越多个 AWS 服务,形成完整的服务调用链。链路跟踪技术使开发团队能够可视化并分析这些分布式操作,从而:

  • 发现性能瓶颈和延迟异常点
  • 快速定位跨服务故障根源
  • 了解服务依赖关系和影响范围
  • 量化不同组件对端到端的延迟

以匹配流程为例,一个完整的玩家匹配请求链路可能包含:

Client → API Gateway → Lambda → DynamoDB(玩家属性查询)→ FlexMatch → GameLift → EC2 游戏服务器实例

在这一链路中,任何环节的延迟或错误都将直接影响玩家体验。尤其在竞技类游戏中,玩家匹配的速度和准确性至关重要,需要对整条链路实现全面监控。通过 CloudWach 可以统一的将 Lambda Duration ,Dynamodb 的 Table Latency 放在同一个面部中查看,这样监控过程就比较清晰了,如下图所示:

同样的,您也可以借助 aws x-ray 实现链路的具体观测。

3.3 日志收集与分析(Logging)

完善的日志系统是问题排查的基础,支持多种日志收集方案来搜集游戏服务器日志:

  • SSH 直接访问模式:对于开发和测试环境,可通过 SSH 直接连接至实例查看实时日志
  • S3 直接写入:游戏服务器可配置为直接将日志写入 S3 存储桶,便于长期存储和分析
  • FluentBit 集成方案:在游戏服务器实例上配置 FluentBit 作为日志转发代理,导出到 Grafana 或者是 OpenSearch

4. 其它工具介绍

4.1 本地环境调试

GameLift 不仅支持云端部署,同时提供了完备的本地测试解决方案,便于开发者在部署到云端前进行快速迭代和调试。根据您使用的 SDK 版本,有以下两种搭建方式:

(1) SDK 4.x 版本:

在 SDK 4.x 中,AWS 提供了一个 Java JAR 包用于本地模拟 GameLift 服务。该工具可模拟核心 GameLift 功能(如 Fleet 注册等),开发者只需将工具集脚本的 endpoint 配置指向本地环境即可完成测试部署。具体步骤如下:

  1. 下载 Amazon GameLift local 的 jar 包:https://aws.amazon.com/cn/gamelift/servers/getting-started/
  2. 设置 JDK8 的的环境运行:将 java -jar GameLiftLocal.jar -p 9080 启动的 9080 作为 GameLift 的 Endpoint 即可。

(2) SDK 5.x 版本:

SDK 5.x 引入了更为先进的 “GameLift Anywhere” 模式。此模式允许开发者将本地机器注册为 GameLift 管理的集群节点,实现与线上环境完全一致的 API 交互体验。简单地通过 create-localtion,注册本地 compute,开发者可使用相同的代码和工作流程,在本地环境中调试游戏服务器,大幅简化了从开发到生产环境的过渡流程。详细参考文档:https://docs.aws.amazon.com/zh_cn/gamelift/latest/developerguide/fleets-creating-anywhere.html

4.2  amazon-gamelift-toolkit

由 AWS 工程师基于实际游戏项目经验开发总结出来的快速上手的脚本,包括快速部署工具,游戏服务器更新部署脚本等。简化传统的部署流程,允许开发者绕过繁琐的 Build 创建和 Fleet 配置步骤,直接将最新游戏服务器构建部署到运行环境中,显著缩短迭代周期 。里面主要包含如下脚本或者工具集:

  • containers-starter-kit:帮助开发者快速开始使用 Amazon GameLift 的容器舰队(Container Fleets)功能。它允许您使用任何 Linux 游戏服务器二进制文件,而无需立即集成 Amazon GameLift Server SDK 就能开始使用。
  • fast-build-update-tool:  是 Amazon GameLift 工具包中的一个命令行工具,专门用于快速更新已部署在 GameLift 舰队上的游戏服务器Build。
  • production-deployment-sample-script:一站式游戏服务器更新工具,能够自动上传新版构建(Build)、部署新服务器群组(Fleet),并通过别名(Alias)机制平滑切换玩家流量,完成迁移后自动清理旧资源。
  • building-gamelift-server-sdk-for-unreal-engine-and-amazon-linux:这个工具通过提供了 DockFile,在 Amazon Linux 2023 环境中为 Unreal Engine 5 构建 Amazon GameLift Server SDK 二进制文件。

更多用法或者详细的脚步使用参数请参考 github:https://github.com/aws/amazon-gamelift-toolkit

5. 总结与展望

本文详细介绍了 Amazon GameLift 的多元化工具生态系统,从管理控制台(Console)到开发工具包(SDK),从命令行接口(CLI)到监控分析平台,构成了一套完整的游戏服务器托管解决方案。这些工具各具特色,能够满足从初创团队到大型工作室的不同需求:

  • GameLift Console:提供直观的可视化界面,适合初期探索和日常管理;
  • GameLift SDK:支持深度集成和定制化功能,满足复杂游戏逻辑需求;
  • AWS CLI:实现自动化部署和操作,提高团队工作效率;
  • 监控与分析工具:确保服务质量和性能优化。

相关链接

本篇作者

胡金东

亚马逊云科技解决方案架构师,目前专注于游戏行业。在加入亚马逊云科技之前,曾担任德勤 Manager,作为项目经理和解决方案架构师,参与了多个大型数据湖和数据仓库项目的项目管理、架构设计和实施工作。

张振华

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案的架构和设计,在 Edge、Serverless 、容器化,微服务架构,云原生 DevOps 等方向具有丰富的实践经验。自加入亚马逊云科技后,专注于游戏行业,以及 GenAI 在游戏行业的应用。