

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

# 使用管理Amazon GameLift Servers托管资源 Amazon CloudFormation
<a name="resources-cloudformation"></a>

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

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

有关的更多信息 Amazon CloudFormation，请参阅《[Amazon CloudFormation 用户指南》](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/)。要查看有关 Amazon GameLift Servers 资源的模板信息，请参阅 [Amazon GameLift Servers 资源类型参考](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/AWS_GameLift.html)。

## 最佳实践
<a name="resources-cloudformation-bestpractices"></a>

有关使用的详细指导 Amazon CloudFormation，请参阅《*Amazon CloudFormation 用户指南》*中的[Amazon CloudFormation 最佳实践](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/best-practices.html)。此外，这些最佳实践与 Amazon GameLift Servers 有特殊关联。
+ **仅通过 Amazon CloudFormation一致地管理您的资源。**如果您更改资源以外的资源，资源将与您的资源模板不同步。 Amazon CloudFormation 
+ **使用 Amazon CloudFormation 堆栈和堆栈集来高效管理多个资源。**
  + 使用堆栈来管理连接的资源组。例如，一个堆栈，其中包含构建、引用该构建的实例集和引用该实例集的别名。如果您更新模板以替换构建，则 Amazon CloudFormation 会替换与该版本连接的舰队。 Amazon CloudFormation 然后更新现有别名以指向新的舰队。有关更多信息，请参阅《Amazon CloudFormation 用户指南》**中的[使用堆栈](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/stacks.html)。
  + 如果您要在多个地区或 Amazon 账户中部署相同的堆栈，请使用 Amazon CloudFormation 堆栈集。有关更多信息，请参阅《Amazon CloudFormation 用户指南》**中的[使用堆栈](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)。
+ **如果您使用竞价型实例，请包括按需型实例集作为备份。**我们建议您在模板中设置每个区域有两个实例集，一个实例集包含竞价型实例，另一个则包含按需型实例。
+ **当您在多个区域中管理资源时，将您的区域特定资源和全局资源分组到单独的堆栈中。**
+ **将您的全局资源置于使用它的服务附近。**队列和对战配置等资源往往会接收来自特定源）的大量请求。通过将资源放在靠近这些请求源的位置，您可以最大限度地减少请求行程时间并提高整体性能。
+ **将您的对战配置放在与使用它的游戏会话队列相同的区域中。**
+ **为堆栈中的每个实例集创建一个单独的别名。**

## 使用 Amazon CloudFormation 堆栈
<a name="resources-cloudformation-multistack"></a>

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

### 用于单个位置的堆栈
<a name="resources-cloudformation-multistack-singleregion"></a>

要在单个位置管理 Amazon GameLift Servers 资源，我们建议采用双栈结构：
+ **支持堆栈** – 此堆栈包含您的 Amazon GameLift Servers 资源所依赖的资源。此堆栈至少应包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。堆栈还应包括一个 IAM 角色，该角色Amazon GameLift Servers允许在创建Amazon GameLift Servers构建或脚本资源时从 S3 存储桶检索文件。该堆栈还可能包含用于游戏的其他 Amazon 资源，例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。
+ **Amazon GameLift Serversst** ack — 此堆栈包含您的所有Amazon GameLift Servers资源，包括构建或脚本、一组舰队、别名和游戏会话队列。 Amazon CloudFormation 使用存储在 S3 存储桶位置的文件创建生成或脚本资源，并将构建或脚本部署到一个或多个队列资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。如果您使用 FlexMatch 配对，则此堆栈还包含配对配置和规则集。

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

![\[\]](http://docs.amazonaws.cn/gameliftservers/latest/developerguide/images/resources-cf_single_vsd.png)


### 适用于多个区域的堆栈
<a name="resources-cloudformation-multistack-multiregion"></a>

在多个区域中部署游戏时，请注意资源如何跨区域进行交互。部分资源（例如 Amazon GameLift Servers 队组）只能引用同一区域中的其他资源。其他资源（例如Amazon GameLift Servers队列）与区域无关。要管理多个区域中的 Amazon GameLift Servers 资源，我们建议使用以下结构。
+ **区域支持堆栈** – 这些堆栈包含您的 Amazon GameLift Servers 资源所依赖的资源。此堆栈必须包括您存储自定义游戏服务器或 Realtime 脚本文件的 S3 存储桶。它还可能包含用于您的游戏的其他 Amazon 资源，例如 DynamoDB 表、Amazon Redshift 集群和 Lambda 函数。其中许多资源特定于区域，因此您必须在各个区域中创建它们。Amazon GameLift Servers 还需要允许访问这些支持资源的 IAM 角色。由于 IAM 角色与区域无关，因此您只需要一个角色资源，放置在任意区域中，并在所有其他支持堆栈中引用。
+ **区域Amazon GameLift Servers堆栈**-此堆栈包含部署游戏的每个区域中必须存在的Amazon GameLift Servers资源，包括版本或脚本、一组队列和别名。 Amazon CloudFormation 使用文件在 S3 存储桶位置创建生成或脚本资源，并将构建或脚本部署到一个或多个队列资源。每个实例集都应该具有一个对应的别名。游戏会话队列引用部分或全部实例集别名。您可以维护一个模板，用于描述这种类型的堆栈并将其用于在每个区域中创建相同的资源集。
+ **全局 Amazon GameLift Servers 堆栈** – 此堆栈包含您的游戏会话队列和对战资源。这些资源可以位于任意区域中，通常放置在相同区域。队列可以引用位于任意区域中的实例集或别名。要在不同的区域中放置其他队列，请创建另外的全局堆栈。

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

![\[\]](http://docs.amazonaws.cn/gameliftservers/latest/developerguide/images/resources-cf_multi_vsd.png)


![\[\]](http://docs.amazonaws.cn/gameliftservers/latest/developerguide/images/resources-cf_multiqueue_vsd.png)


## 更新构建
<a name="resources-cloudformation-updatebuild"></a>

Amazon GameLift Servers 生成包是不可变的，就像生成包与队列之间的关系。因此，当您更新托管资源以使用一组新的游戏构建文件时，必须执行以下操作：
+ 使用一组新文件创建新构建（替换）。
+ 创建一个新的实例集集合以部署新游戏构建（替换）。
+ 重定向别名以指向新实例集（无中断更新）。

有关更多信息，请参阅《Amazon CloudFormation 用户指南》**中的[堆栈资源的更新行为](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-update-behaviors.html)。

### 自动部署构建更新
<a name="resources-cloudformation-updatebuild-auto"></a>

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

1. 从 S3 检索新文件、验证文件并创建新 Amazon GameLift Servers 生成包。

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

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

1. 删除旧实例集。

1. 删除旧构建。

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

您也可以 Amazon CloudFormation 保留资源而不是将其删除。有关更多信息，请参阅《Amazon CloudFormation API Reference》**中的 [RetainResources](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_DeleteStack.html)。

### 手动部署构建更新
<a name="resources-cloudformation-updatebuild-manual"></a>

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

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

下图阐明了此过程。

![\[\]](http://docs.amazonaws.cn/gameliftservers/latest/developerguide/images/resources-cf_updating_vsd.png)


### 回滚的工作原理
<a name="resources-cloudformation-updatebuild-rollbacks"></a>

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

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

有关如何处理失败或卡住的回滚的更多信息，请参阅《Amazon CloudFormation 用户指南》**中的[继续回滚更新](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-continueupdaterollback.html)。