本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS CloudFormation 管理资源
您可以使用 AWS CloudFormation 来管理 Amazon GameLift 资源。在 AWS CloudFormation 中,您可以创建对每个资源构建模型的模板,然后使用该模板创建资源。要更新资源,您可以对模板进行更改,然后使用 AWS CloudFormation 实施更新。您可以将资源按照称为堆栈和堆栈集的逻辑组排列。
使用 AWS CloudFormation 维护您的 Amazon GameLift 托管资源提供了一种更有效的方式来管理 AWS 资源集。您可以使用版本控制来跟踪模板随时间推移的更改,并协调由多个团队成员进行的更新。您还可以重复使用模板。例如,在跨区域部署游戏时,您可以在各个区域中使用相同的模板创建相同的资源。您还可以使用这些模板在另一个分区中部署相同的资源集。
有关 AWS CloudFormation 的更多信息,请参阅《AWS CloudFormation 用户指南》。要查看 Amazon GameLift 资源的模板信息,请参阅 Amazon GameLift 资源类型参考。
最佳实操
有关使用 AWS CloudFormation 的详细指导,请参阅《AWS CloudFormation 用户指南》中的AWS CloudFormation 最佳实操。此外,这些最佳实操与 Amazon GameLift 有特殊关联。
-
仅通过 AWS CloudFormation 一致地管理您的资源。如果您在 AWS CloudFormation 外部更改资源,则资源将与资源模板失去同步。
-
使用 AWS CloudFormation 堆栈和堆栈集高效管理多个资源。
-
如果您使用竞价型实例,请包括按需型实例集作为备份。我们建议您在模板中设置每个区域有两个实例集,一个实例集包含竞价型实例,另一个则包含按需型实例。
-
当您在多个区域中管理资源时,将您的区域特定资源和全局资源分组到单独的堆栈中。
-
将您的全局资源置于使用它的服务附近。队列和对战配置等资源往往会接收来自特定源)的大量请求。通过将资源放在靠近这些请求源的位置,您可以最大限度地减少请求行程时间并提高整体性能。
-
将您的对战配置放在与使用它的游戏会话队列相同的区域中。
-
为堆栈中的每个实例集创建一个单独的别名。
使用 AWS CloudFormation 堆栈
以下是在为 Amazon GameLift 资源设置 AWS CloudFormation 堆栈时建议使用的结构。您的最佳堆栈结构根据您在一个还是多个位置部署游戏而异。
用于单个位置的堆栈
要在单个位置管理 Amazon GameLift 资源,我们建议采用双栈结构:
-
支持堆栈 – 此堆栈包含您的 Amazon GameLift 资源所依赖的资源。此堆栈至少应包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。堆栈还应包含 IAM 角色,在创建 Amazon GameLift 构建或脚本资源时,该角色向 Amazon GameLift 授予从 S3 存储桶检索文件的权限。此堆栈还可能包含用于您游戏的其他 AWS 资源,例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。
-
Amazon GameLift 堆栈 – 此堆栈包含您的所有 Amazon GameLift 资源,包括构建或脚本、实例集集合、别名和游戏会话队列。AWS CloudFormation 使用存储在 S3 存储桶位置中的文件创建构建或脚本资源,并将构建或脚本部署到一个或多个实例集资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。如果您使用 FlexMatch 进行对战,则此堆栈还包含对战配置和规则集。
下图说明了用于在单个 AWS 区域中部署资源的双堆栈结构。
适用于多个区域的堆栈
在多个区域中部署游戏时,请注意资源如何跨区域进行交互。部分资源(例如 Amazon GameLift 实例集)只能引用同一区域中的其他资源。其他资源(例如 Amazon GameLift 队列)与区域无关。要管理多个区域中的 Amazon GameLift 资源,我们建议使用以下结构。
-
区域支持堆栈 – 这些堆栈包含您的 Amazon GameLift 资源所依赖的资源。此堆栈必须包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。此堆栈还可能包含针对您游戏的其他 AWS 资源,例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。这些资源中有许多是特定于区域的,因此您必须在每个区域创建它们。Amazon GameLift 还需要一个 IAM 角色,允许访问受支持资源。由于 IAM 角色与区域无关,因此您只需要一个角色资源,放置在任意区域中,并在所有其他支持堆栈中引用。
-
区域 Amazon GameLift 堆栈 – 此堆栈包含部署游戏的各个区域中必须存在的 Amazon GameLift 资源,包括构建或脚本、实例集集合和别名。AWS CloudFormation 使用 S3 存储桶位置中的文件创建构建或脚本,并将构建或脚本部署到一个或多个实例集资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。您可以维护一个模板,用于描述这种类型的堆栈并将其用于在每个区域中创建相同的资源集。
-
全局 Amazon GameLift 堆栈 – 此堆栈包含您的游戏会话队列和对战资源。这些资源可以位于任意区域中,通常放置在相同区域。队列可以引用位于任意区域中的实例集或别名。要在不同的区域中放置其他队列,请创建另外的全局堆栈。
下图说明了在多个 AWS 区域中部署资源的多堆栈结构。第一张图显示了单个游戏会话队列的结构。第二张图显示了多个队列的结构。
更新构建
Amazon GameLift 构建是不可变的,就像构建与实例集之间的关系。因此,当您更新托管资源以使用一组新的游戏构建文件时,必须执行以下操作:
-
使用一组新文件创建新构建(替换)。
-
创建一个新的实例集集合以部署新游戏构建(替换)。
-
重定向别名以指向新实例集(无中断更新)。
有关更多信息,请参阅《AWS CloudFormation 用户指南》中的堆栈资源的更新行为。
自动部署构建更新
更新包含相关构建、实例集和别名资源的堆栈时,默认 AWS CloudFormation 行为是自动执行序列中的这些步骤。通过先将新构建文件上传到新的 S3 位置即可触发此更新。然后,您修改 AWS CloudFormation 构建模板以指向新 S3 位置。使用新 S3 位置更新堆栈时,这将触发以下 AWS CloudFormation 序列:
-
从 S3 检索新文件、验证文件并创建新 Amazon GameLift 构建。
-
在队列模板中更新构建引用,该引用将触发新实例集创建。
-
新实例集处于活动状态之后,更新别名中的实例集引用,这将触发将别名更新以指向新实例集。
-
删除旧实例集。
-
删除旧构建。
如果您的游戏会话队列使用实例集别名,则玩家流量会在更新别名之后自动切换到新实例集。在游戏会话结束时,旧实例集中的玩家逐渐全部退出。在玩家流量波动时,Auto-scaling 处理在每个实例集集合中添加和删除实例的任务。或者,您可以指定所需的初始实例计数,以便快速增加切换并在稍后启用 Auto-scaling。
您还可以让 AWS CloudFormation 保留资源而不是删除资源。有关更多信息,请参阅《AWS CloudFormation API 参考》中的 RetainResources。
手动部署构建更新
在希望更好地控制什么时候为玩家上线新实例集时,您可以利用一些选项。您可以选择使用 Amazon GameLift 控制台或 CLI 来手动管理别名。或者,您无需更新构建模板以替换构建和实例集,而是可以向模板添加第二个构建和实例集定义集合。当您更新模板时,AWS CloudFormation 创建第二个构建资源和相应的实例集。由于未替换现有资源,因此这些资源不会被删除,别名仍然指向原始实例集。
这种方法的主要优点在于向您提供了灵活性。您可以为构建的新版本创建单独的资源,测试新资源,并控制何时为玩家上线新实例集。这种方法的一个潜在缺点是,在很短的一段时间内,它在各个区域中需要两倍的资源。
下图阐明了此过程。
回滚的工作原理
执行资源更新时,如果任何步骤未成功完成,AWS CloudFormation 将自动启动回滚。此过程反向执行序列中的各个步骤,删除新创建的资源。
如果您需要手动触发回滚,请将构建模板的 S3 位置键更改回原始位置并更新堆栈。此时创建新 Amazon GameLift 构建和实例集,在该实例集处于活动状态之后,别名切换回新实例集。如果您要单独管理别名,则需要将其切换为指向新实例集。
有关如何处理失败或卡住的回滚的更多信息,请参阅《AWS CloudFormation 用户指南》中的继续回滚更新。