使用 Amazon CloudFormation 管理资源 - Amazon GameLift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Amazon CloudFormation 管理资源

您可以使用 Amazon CloudFormation 来管理 Amazon GameLift 资源。在 Amazon CloudFormation 中,您可以创建对每个资源构建模型的模板,然后使用该模板创建资源。要更新资源,您可以对模板进行更改,然后使用 Amazon CloudFormation 实施更新。您可以将资源按照称为堆栈和堆栈集的逻辑组排列。

使用 Amazon CloudFormation 维护您的 Amazon GameLift 托管资源提供了一种更有效的方式来管理 Amazon 资源集。您可以使用版本控制来跟踪模板随时间推移的更改,并协调由多个团队成员进行的更新。您还可以重复使用模板。例如,在跨区域部署游戏时,您可以在各个区域中使用相同的模板创建相同的资源。您还可以使用这些模板在另一个分区中部署相同的资源集。

有关 Amazon CloudFormation 的更多信息,请参阅《Amazon CloudFormation 用户指南》。要查看 Amazon GameLift 资源的模板信息,请参阅 Amazon GameLift 资源类型参考

最佳实操

有关使用 Amazon CloudFormation 的详细指导,请参阅《Amazon CloudFormation 用户指南》中的Amazon CloudFormation 最佳实操。此外,这些最佳实操与 Amazon GameLift 有特殊关联。

  • 仅通过 Amazon CloudFormation 一致地管理您的资源。如果您在 Amazon CloudFormation 外部更改资源,则资源将与资源模板失去同步。

  • 使用 Amazon CloudFormation 堆栈和堆栈集高效管理多个资源。

    • 使用堆栈来管理连接的资源组。例如,一个堆栈,其中包含构建、引用该构建的实例集和引用该实例集的别名。如果您更新模板以替换构建,Amazon CloudFormation 还会替换连接到构建的实例集。然后,Amazon CloudFormation 更新现有别名以指向新实例集。有关更多信息,请参阅《Amazon CloudFormation 用户指南》中的使用堆栈

    • 如果您要跨多个区域或 Amazon 账户部署相同的堆栈,请使用 Amazon CloudFormation 堆栈集。有关更多信息,请参阅《Amazon CloudFormation 用户指南》中的使用堆栈

  • 如果您使用竞价型实例,请包括按需型实例集作为备份。我们建议您在模板中设置每个区域有两个实例集,一个实例集包含竞价型实例,另一个则包含按需型实例。

  • 当您在多个区域中管理资源时,将您的区域特定资源和全局资源分组到单独的堆栈中。

  • 将您的全局资源置于使用它的服务附近。队列和对战配置等资源往往会接收来自特定源)的大量请求。通过将资源放在靠近这些请求源的位置,您可以最大限度地减少请求行程时间并提高整体性能。

  • 将您的对战配置放在与使用它的游戏会话队列相同的区域中。

  • 为堆栈中的每个实例集创建一个单独的别名。

使用 Amazon CloudFormation 堆栈

以下是在为 Amazon GameLift 资源设置 Amazon CloudFormation 堆栈时建议使用的结构。您的最佳堆栈结构根据您在一个还是多个位置部署游戏而异。

用于单个位置的堆栈

要在单个位置管理 Amazon GameLift 资源,我们建议采用双栈结构:

  • 支持堆栈 – 此堆栈包含您的 Amazon GameLift 资源所依赖的资源。此堆栈至少应包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。堆栈还应包含 IAM 角色,在创建 Amazon GameLift 构建或脚本资源时,该角色向 Amazon GameLift 授予从 S3 存储桶检索文件的权限。此堆栈还可能包含用于您游戏的其他 Amazon 资源,例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。

  • Amazon GameLift 堆栈 – 此堆栈包含您的所有 Amazon GameLift 资源,包括构建或脚本、实例集集合、别名和游戏会话队列。Amazon CloudFormation 使用存储在 S3 存储桶位置中的文件创建构建或脚本资源,并将构建或脚本部署到一个或多个实例集资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。如果您使用 FlexMatch 进行对战,则此堆栈还包含对战配置和规则集。

下图说明了用于在单个 Amazon 区域中部署资源的双堆栈结构。


                    该图显示了两个 Amazon CloudFormation 堆栈。一个堆栈包含 Amazon GameLift 资源,另一个则包含支持 GameLift 的资源。后一个堆栈包括用于存储构建文件或脚本文件的 S3 存储桶,以及允许 Amazon GameLift 从 S3 存储桶检索文件的 IAM 角色。

适用于多个区域的堆栈

在多个区域中部署游戏时,请注意资源如何跨区域进行交互。部分资源(例如 Amazon GameLift 实例集)只能引用同一区域中的其他资源。其他资源(例如 Amazon GameLift 队列)与区域无关。要管理多个区域中的 Amazon GameLift 资源,我们建议使用以下结构。

  • 区域支持堆栈 – 这些堆栈包含您的 Amazon GameLift 资源所依赖的资源。此堆栈必须包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。此堆栈还可能包含针对您游戏的其他 Amazon 资源,例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。这些资源中有许多是特定于区域的,因此您必须在每个区域创建它们。Amazon GameLift 还需要一个 IAM 角色,允许访问受支持资源。由于 IAM 角色与区域无关,因此您只需要一个角色资源,放置在任意区域中,并在所有其他支持堆栈中引用。

  • 区域 Amazon GameLift 堆栈 – 此堆栈包含部署游戏的各个区域中必须存在的 Amazon GameLift 资源,包括构建或脚本、实例集集合和别名。Amazon CloudFormation 使用 S3 存储桶位置中的文件创建构建或脚本,并将构建或脚本部署到一个或多个实例集资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。您可以维护一个模板,用于描述这种类型的堆栈并将其用于在每个区域中创建相同的资源集。

  • 全局 Amazon GameLift 堆栈 – 此堆栈包含您的游戏会话队列和对战资源。这些资源可以位于任意区域中,通常放置在相同区域。队列可以引用位于任意区域中的实例集或别名。要在不同的区域中放置其他队列,请创建另外的全局堆栈。

下图说明了在多个 Amazon 区域中部署资源的多堆栈结构。第一张图显示了单个游戏会话队列的结构。第二张图显示了多个队列的结构。


                    此图显示了三个区域的多个 Amazon CloudFormation 堆栈。每个区域中的支持堆栈包含支持资源,例如 S3 存储桶。其中一个堆栈还包含 IAM 角色,该角色可由 Amazon GameLift 用于访问任何支持资源,而不受区域的限制。区域 Amazon GameLift 堆栈包含 Amazon GameLift 构建或脚本、实例集和别名。全局 Amazon GameLift 堆栈包含对战资源和队列,它们可以引用多个区域中的实例集或别名。

                    此图显示了三个区域的多个 Amazon CloudFormation 堆栈,包括在两个区域中具有游戏会话队列的 Amazon GameLift 全局堆栈。每个队列引用来自 Amazon GameLift 区域堆栈的别名。

更新构建

Amazon GameLift 构建是不可变的,就像构建与实例集之间的关系。因此,当您更新托管资源以使用一组新的游戏构建文件时,必须执行以下操作:

  • 使用一组新文件创建新构建(替换)。

  • 创建一个新的实例集集合以部署新游戏构建(替换)。

  • 重定向别名以指向新实例集(无中断更新)。

有关更多信息,请参阅《Amazon CloudFormation 用户指南》中的堆栈资源的更新行为

自动部署构建更新

更新包含相关构建、实例集和别名资源的堆栈时,默认 Amazon CloudFormation 行为是自动执行序列中的这些步骤。通过先将新构建文件上传到新的 S3 位置即可触发此更新。然后,您修改 Amazon CloudFormation 构建模板以指向新 S3 位置。使用新 S3 位置更新堆栈时,这将触发以下 Amazon CloudFormation 序列:

  1. 从 S3 检索新文件、验证文件并创建新 Amazon GameLift 构建。

  2. 在队列模板中更新构建引用,该引用将触发新实例集创建。

  3. 新实例集处于活动状态之后,更新别名中的实例集引用,这将触发将别名更新以指向新实例集。

  4. 删除旧实例集。

  5. 删除旧构建。

如果您的游戏会话队列使用实例集别名,则玩家流量会在更新别名之后自动切换到新实例集。在游戏会话结束时,旧实例集中的玩家逐渐全部退出。在玩家流量波动时,Auto-scaling 处理在每个实例集集合中添加和删除实例的任务。或者,您可以指定所需的初始实例计数,以便快速增加切换并在稍后启用 Auto-scaling。

您还可以让 Amazon CloudFormation 保留资源而不是删除资源。有关更多信息,请参阅《Amazon CloudFormation API 参考》中的 RetainResources

手动部署构建更新

在希望更好地控制什么时候为玩家上线新实例集时,您可以利用一些选项。您可以选择使用 Amazon GameLift 控制台或 CLI 来手动管理别名。或者,您无需更新构建模板以替换构建和实例集,而是可以向模板添加第二个构建和实例集定义集合。当您更新模板时,Amazon CloudFormation 创建第二个构建资源和相应的实例集。由于未替换现有资源,因此这些资源不会被删除,别名仍然指向原始实例集。

这种方法的主要优点在于向您提供了灵活性。您可以为构建的新版本创建单独的资源,测试新资源,并控制何时为玩家上线新实例集。这种方法的一个潜在缺点是,在很短的一段时间内,它在各个区域中需要两倍的资源。

下图阐明了此过程。


                    图中显示了三个区域的多个 Amazon CloudFormation 堆栈,包括在两个区域中具有游戏会话队列的 Amazon GameLift 全局堆栈。每个队列引用来自 Amazon GameLift 区域堆栈的别名。

回滚的工作原理

执行资源更新时,如果任何步骤未成功完成,Amazon CloudFormation 将自动启动回滚。此过程反向执行序列中的各个步骤,删除新创建的资源。

如果您需要手动触发回滚,请将构建模板的 S3 位置键更改回原始位置并更新堆栈。此时创建新 Amazon GameLift 构建和实例集,在该实例集处于活动状态之后,别名切换回新实例集。如果您要单独管理别名,则需要将其切换为指向新实例集。

有关如何处理失败或卡住的回滚的更多信息,请参阅《Amazon CloudFormation 用户指南》中的继续回滚更新