

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

# 验证集装箱队列部署并对其进行故障排除
<a name="containers-deployment-validation"></a>

*队列部署*（在本主题中称为*部*署）是将容器队列实例上的容器替换为使用队列新设置（例如新的容器组定义版本）的容器的过程。Amazon GameLift Servers部署不是一次更换每个正在运行的容器，而是首先验证新容器是否可以托管游戏会话，然后逐步替换其余容器以捕捉不良更改，然后再将其部署到整个队列。集装箱舰队在三种情况下开始部署：
+ **当您使用容器组定义创建队列时。**如果您的[CreateContainerFleet](https://docs.amazonaws.cn/gamelift/latest/apireference/API_CreateContainerFleet.html)请求包含游戏服务器容器组定义，则队列创建会启动部署，将您的容器安装在队列的新实例上。如果您创建的队列没有容器组定义，则在您添加游戏服务器容器组定义之前，不会部署任何实例，也不会部署队列。
+ **当您更新舰队的容器组定义或其他容器设置时。** [UpdateContainerFleet](https://docs.amazonaws.cn/gamelift/latest/apireference/API_UpdateContainerFleet.html)当更新更改队列运行的容器时（例如，当您指定新的游戏服务器容器组定义版本时），就会开始部署。不更改任何设置的更新都不会启动部署。有关哪些设置启动部署的信息，请参阅[更新一个 亚马逊 GameLift 服务器 托管集装箱船队](containers-update-fleet.md)。
+ **当你向活跃舰队添加地点时。** Amazon GameLift Servers使用队列配置的容器组定义在新位置开始部署。现有地点不会重新部署。在另一次部署正在进行时，您无法添加地点。

要查看部署的详细信息，请调用 [DescribeFleetDeployment](https://docs.amazonaws.cn/gamelift/latest/apireference/API_DescribeFleetDeployment.html)，它会返回一个[FleetDeployment](https://docs.amazonaws.cn/gamelift/latest/apireference/API_FleetDeployment.html)对象。它包括部署 ID、状态和配置，以及正在部署的容器组定义版本和回滚版本。舰队的`DeploymentDetails.LatestDeploymentId`财产标识了其最新部署。

**注意**  
部署仅适用于托管集装箱舰队。

## 配置部署
<a name="containers-deployment-validation-config"></a>

部署[DeploymentConfiguration](https://docs.amazonaws.cn/gamelift/latest/apireference/API_DeploymentConfiguration.html)是一组规则，用于控制部署在舰队中的进行方式以及部署失败时会发生什么。有关每个设置的值和默认值的信息，请参阅 *Amazon GameLift ServersAPI 参考[DeploymentConfiguration](https://docs.amazonaws.cn/gamelift/latest/apireference/API_DeploymentConfiguration.html)*中的。

您可以在控制台中调用`UpdateContainerFleet`或编辑队列时设置部署配置。 `CreateContainerFleet`不接受部署配置，因此队列的首次部署始终使用默认值。

## 操作方法 亚马逊 GameLift 服务器 验证部署
<a name="containers-deployment-validation-howitworks"></a>

部署开始时，Amazon GameLift Servers首先验证队伍中每个位置的游戏服务器容器组。它使用船队现有容量的一小部分运行新集装箱，并检查它们是否处于健康状态。当游戏服务器容器调用报告它已准备好托管游戏会话`ProcessReady()`时，新的游戏服务器容器组就处于*健康*状态。

此初始验证会检查游戏服务器容器组。如果您的队列还使用每个实例的容器组定义，则在Amazon GameLift Servers更新游戏服务器组后更新这些组。 Amazon GameLift Servers在部署完成之前分别检查每个实例的组；它们不使用游戏服务器的`ProcessReady()`检查。

如果新的游戏服务器容器组在Amazon GameLift Servers停止等待之前未恢复正常，则验证失败。有关常见原因以及如何调查这些原因的信息，请参阅[调试受损的部署](#containers-deployment-validation-debug)。

如果验证失败，则Amazon GameLift Servers应用部署`ImpairmentStrategy`并将部署状态设置为 `IMPAIRED` (for`MAINTAIN`) 或 `ROLLBACK_IN_PROGRESS` (for`ROLLBACK`)。只有在某个位置成功验证后，才会Amazon GameLift Servers替换在那里运行游戏服务器的剩余容器。

### 验证需要多长时间
<a name="containers-deployment-validation-timeouts"></a>

当用于验证的容量Amazon GameLift Servers用于托管受保护的游戏会话时，验证需要更长的时间。舰队`NewGameSessionProtectionPolicy`决定了新游戏会话的默认保护。有效值为 `NoProtection` 和 `FullProtection`。部署`ProtectionStrategy`决定部署是否支持该保护。有效值为 `WITH_PROTECTION` 和 `IGNORE_PROTECTION`。

当队列`NewGameSessionProtectionPolicy`设置为`FullProtection`且部署设置`ProtectionStrategy`为时`WITH_PROTECTION`，Amazon GameLift Servers允许延长受保护游戏会话结束的验证超时时间。对于任何其他组合，它使用的超时时间都更短。

**重要**  
如果您的新容器从未运行正常，并且队列在`WITH_PROTECTION`部署中`FullProtection`使用，则部署可以保持`IN_PROGRESS`状态，直到受保护的游戏会话在报告失败之前结束。要更快地获得信号，请在测试新的容器镜像`IGNORE_PROTECTION`时部署它们，或者自己取消部署。有关取消部署的说明，请参阅[通过启动新部署来取消部署](#containers-deployment-validation-cancel)。  
如果你[UpdateGameSession](https://docs.amazonaws.cn/gamelift/latest/apireference/API_UpdateGameSession.html)在舰队中保护个人游戏会话`NoProtection`，`NewGameSessionProtectionPolicy`那么等待时间就Amazon GameLift Servers不会延长。如果这些游戏会话没有及时结束，即使新配置正在运行，验证也可能失败。

## 跟踪部署状态
<a name="containers-deployment-validation-status"></a>

要在[Amazon GameLift Servers控制台](https://console.amazonaws.cn/gamelift/)中跟踪部署，请打开队列并选择**部署**选项卡。要使用 Amazon Command Line Interface (Amazon CLI) 对其进行跟踪，[list-fleet-deployments](https://docs.amazonaws.cn/cli/latest/reference/gamelift/list-fleet-deployments.html)请使用查找部署 ID，然后[describe-fleet-deployment](https://docs.amazonaws.cn/cli/latest/reference/gamelift/describe-fleet-deployment.html)使用查找单个部署的详细信息。

有关部署状态值及其含义的信息，请参阅 *Amazon GameLift ServersAPI 参考[DeploymentStatus](https://docs.amazonaws.cn/gamelift/latest/apireference/API_FleetDeployment.html#gameliftservers-Type-FleetDeployment-DeploymentStatus)*中的。

## 调试受损的部署
<a name="containers-deployment-validation-debug"></a>

部署受损意味着新容器在验证期间没有恢复正常：在Amazon GameLift Servers停止等待`ProcessReady()`之前没有游戏服务器容器被调用，这通常是因为容器退出或无法启动。原因通常出在容器镜像或游戏服务器上。找出容器退出的原因或为什么游戏服务器从未报告准备就绪。

### 查看舰队事件日志
<a name="containers-deployment-validation-debug-events"></a>

舰队事件日志记录了部署期间Amazon GameLift Servers观察到的情况。在控制台中舰队的 “**事件**” 选项卡上查看，或致电[describe-fleet-events](https://docs.amazonaws.cn/cli/latest/reference/gamelift/describe-fleet-events.html)。以下事件代码与失败的部署有关：
+ `GAME_SERVER_CONTAINER_GROUP_CRASHED`和 `PER_INSTANCE_CONTAINER_GROUP_CRASHED` — 容器组已退出或无法启动。当Amazon GameLift Servers有容器的退出代码时，它会在事件消息中包含该代码。
+ `GAME_SERVER_CONTAINER_GROUP_REPLACED_UNHEALTHY`和 `INSTANCE_REPLACED_UNHEALTHY` — Amazon GameLift Servers 替换了一个容器组或一个运行状况不佳的实例。部署失败时，这些事件可能会在舰队的各个位置重复。
+ `SERVER_PROCESS_MISCONFIGURED_CONTAINER_PORT`— 游戏服务器容器使用的端口与容器组定义中声明的端口不匹配。
+ `LOCATION_STATE_UPDATING`而且 `LOCATION_STATE_ACTIVE` — 它们将每个位置的部署分成一列，这可以帮助你将其他事件与产生这些事件的部署对齐。
+ `COMPUTE_LOG_UPLOAD_FAILED`— 容器的日志收集已停止工作，因此该容器中的日志可能不完整或丢失。

### 阅读容器日志
<a name="containers-deployment-validation-debug-logs"></a>

集装箱舰队的`LogConfiguration`集合Amazon GameLift Servers将每个容器的标准输出发送到哪里：`CLOUDWATCH`（默认）`S3`、或`NONE`。将其设置为 or`CLOUDWATCH`，`S3`以便在部署失败时容器输出可用。当容器在游戏服务器开始运行之前出现故障时，例如由于容器的入口点引用了图像中不存在的文件，则此输出是唯一的失败记录。有关容器日志记录的信息，请参阅[日志差异：托管舰队 EC2 与容器舰队](logging-server-messages-ec2-vs-containers.md)。

### Connect 连接到受损的容器
<a name="containers-deployment-validation-debug-connect"></a>

如果您使用`MAINTAIN`减值策略进行部署，则可以连接到Amazon GameLift Servers保存该策略的容器并直接对其进行检查。使用它来检查文件权限，确认图像实际包含哪些文件，然后手动运行游戏服务器可执行文件以查看其报告的内容。有关连接容器的说明，请参阅[Connect 到容器](containers-remote-access.md)。

### 常见的部署问题
<a name="containers-deployment-validation-debug-causes"></a>

以下症状及其常见原因在部署失败或部署缓慢中很常见。

**容器一遍又一遍地立即启动和退出。**  
如果容器的入口点无法运行，请检查以下内容：  
+ 验证镜像中启动脚本和游戏服务器可执行文件是否标记为可执行。
+ 确认可执行文件的 CPU 架构与队列的实例类型相匹配。
+ 检查图像是否包含可执行文件所需的解释器和共享库。
有关构建Amazon GameLift Servers可以运行的映像的信息，请参阅[为构建容器镜像 亚马逊 GameLift 服务器](containers-prepare-images.md)。

**部署速度很慢，但没有任何失败。**  
`WITH_PROTECTION`部署会等待受保护的游戏会话结束，无论是在验证期间还是在替换舰队的容器时。在将长时间部署视为失败之前，请检查舰队的活跃游戏会话。有关验证等待时间的信息，请参阅[验证需要多长时间](#containers-deployment-validation-timeouts)。

## 通过启动新部署来取消部署
<a name="containers-deployment-validation-cancel"></a>

要取消部署并将队列恢复到之前的配置，请在控制台中调用`UpdateContainerFleet`或编辑舰队以开始新的部署，从而撤消更改。最常见的情况是新的容器组定义版本，以下过程将恢复该版本。 Amazon GameLift Servers将队列上次在进行中的部署中处于活动状态时使用的版本记录为`RollbackGameServerBinaryArn`和`RollbackPerInstanceBinaryArn`，因此您不必确定要返回到哪个版本。如果部署还更改了其他设置，例如日志配置或连接端口范围，请在同一个`UpdateContainerFleet`请求中重新设置这些设置。

在开始之前，请 Amazon CLI 为您的账户配置并确定舰队的所在地 Amazon Web Services 区域。此过程需要正在进行的部署和之前的容器组定义版本才能恢复。用于`list-fleet-deployments`查找部署 ID。有关说明，请参阅[跟踪部署状态](#containers-deployment-validation-status)。

在命令中，{{fleet-id}}替换为你的舰队 ID、{{deployment-id}}正在进行的部署 ID 和舰队{{fleet-home-region}}的所在 Amazon Web Services 区域地。

**将正在进行的部署替换为以前的容器版本 (Amazon CLI)**

1. 使用以下 Amazon CLI 命令获取要返回的版本：

   ```
   aws gamelift describe-fleet-deployment \
       --fleet-id {{fleet-id}} \
       --deployment-id {{deployment-id}} \
       --region {{fleet-home-region}}
   ```

   在响应中，`RollbackGameServerBinaryArn`保存了队列上次处于活动状态时使用的游戏服务器容器组定义版本。如果队列具有每个实例的容器组，则`RollbackPerInstanceBinaryArn`保留该版本。

1. 使用以下 Amazon CLI 命令以该版本启动新部署。{{rollback-game-server-cgd-arn}}替换为步骤 1 中的`RollbackGameServerBinaryArn`值。如果队列具有每个实例的容器组，则还要传递`--per-instance-container-group-definition-name`该`RollbackPerInstanceBinaryArn`值。

   ```
   aws gamelift update-container-fleet \
       --fleet-id {{fleet-id}} \
       --game-server-container-group-definition-name {{rollback-game-server-cgd-arn}} \
       --region {{fleet-home-region}}
   ```

1. 确认之前的部署会报告`CANCELLED`状态，并且新的部署在完成`COMPLETE`时会报告。

**注意**  
以这种方式取消部署并不是立即停止。新的部署与其他部署的步骤相同，包括验证，因此舰队需要一些时间才能安顿下来。舰队之前成功运行的版本通常会很快得到验证。

## 相关主题
<a name="containers-deployment-validation-related"></a>

有关更多信息，请参阅以下主题。
+ [更新一个 亚马逊 GameLift 服务器 托管集装箱船队](containers-update-fleet.md)
+ [Connect 到容器](containers-remote-access.md)
+ [为构建容器镜像 亚马逊 GameLift 服务器](containers-prepare-images.md)
+ [日志差异：托管舰队 EC2 与容器舰队](logging-server-messages-ec2-vs-containers.md)
+ [监控 亚马逊 GameLift 服务器 和亚马逊合作 CloudWatch](monitoring-cloudwatch.md)
+ [容器是如何工作的 亚马逊 GameLift 服务器](containers-howitworks.md)