

# 对 Amazon ECS 部署策略更新进行问题排查
<a name="troubleshooting-deployment-controller-migration"></a>

本节提供在迁移部署策略时可能遇到的常见问题的解决方案。

## 多个服务修订版或任务集
<a name="troubleshooting-multiple-task-sets"></a>

以下问题与部署存在多个服务修订版有关。

更新 ECS 部署控制器时存在多个任务集  
*错误消息*：`Updating the deployment controller is not supported when there are multiple tasksets in the service. Please ensure your service has only one taskset and try again.`  
*解决方案*：尝试更改具有多个有效任务集的服务的部署控制器类型时，会发生此错误。要解决 `CODE_DEPLOY` 或 `EXTERNAL` 部署控制器中出现的此问题，请执行以下操作：  

1. 检查当前任务集：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].taskSets"
   ```

1. 等待任何正在进行的部署完成。

1. 强制实施新部署以清理任务集：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --force-new-deployment
   ```

1. 如有必要，请手动删除额外的任务集：

   ```
   aws ecs delete-task-set --cluster {{your-cluster-name}} --service {{your-service-name}} --task-set {{task-set-id}}
   ```

1. 当只剩下一个任务集后，重新尝试更新部署控制器。
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

更新 `ECS` 部署控制器时缺少主任务集  
*错误消息*：`Updating the deployment controller requires a primary taskset in the service. Please ensure your service has a primary taskset and try again.`  
*解决方案*：尝试更改没有主任务集的服务部署控制器类型时，会发生此错误。要解决此问题，请执行以下操作：  

1. 验证服务状态和任务集。如果服务中存在任务集，则应将其标记为 `ACTIVE`。

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].taskSets[*].[status,id]
   ```

   如果服务中没有处于 `ACTIVE` 状态的任务集，请迁移部署。有关更多信息，请参阅[迁移方法](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/migrate-codedeploy-to-ecs-bluegreen.html#migration-paths)。

1. 如果服务没有正在运行的任务，请通过更新服务来部署至少一个任务：

   ```
   aws ecs update-service-primary-task-set --cluster {{your-cluster-name}} --service {{your-service-name}} --primary-task-set your-taskset-id
   ```

   这会将服务中的（先前为 `ACTIVE`）任务集标记为 `PRIMARY` 状态。

1. 等待任务达到稳定的运行状态。可以通过以下方式查看状态：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].deployments"
   ```

1. 当服务拥有主任务集且任务正在运行后，重新尝试更新部署控制器。
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

## 部署失败检测类型和部署控制器不匹配
<a name="troubleshooting-failure-detection"></a>

以下问题与部署失败检测类型和部署控制器不匹配有关。

使在非 ECS 控制器上使用部署断路器  
*错误消息*：`Deployment circuit breaker feature is only supported with ECS deployment controller. Update to ECS deployment controller and try again.`  
*解决方案*：尝试在未使用 `ECS` 部署控制器的服务上启用部署断路器功能时，会发生此错误。部署断路器仅与 `ECS` 部署控制器兼容。  

1. 检查服务的当前部署控制器：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].deploymentController"
   ```

1. 更新服务以使用 `ECS` 部署控制器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-controller type=ECS
   ```

1. 服务使用 `ECS` 部署控制器后，启用部署断路器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-configuration "deploymentCircuitBreaker={enable=true,rollback=true}"
   ```
有关更多信息，请参阅 [Amazon ECS 部署断路器如何检测故障](deployment-circuit-breaker.md)。

在非 ECS 控制器上使用基于警报的回滚  
*错误消息*：`Alarm based rollback feature is only supported with ECS deployment controller. Update to ECS deployment controller and try again.`  
*解决方案*：尝试在未使用 `ECS` 部署控制器的服务上配置基于警报的回滚时，会发生此错误。基于警报的回滚功能仅与 `ECS` 部署控制器兼容。  

1. 检查服务的当前部署控制器：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].deploymentController"
   ```

1. 更新服务以使用 `ECS` 部署控制器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-controller type=ECS
   ```

1. 服务使用 `ECS` 部署控制器后，配置基于警报的回滚：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --services {{your-service-name}} --deployment-configuration "alarms={alarmNames=[your-alarm-name],enable=true,rollback=true}"
   ```
有关更多信息，请参阅 [CloudWatch 警报如何检测 Amazon ECS 部署故障](deployment-alarm-failure.md)。

## Service Connect 和部署控制器不匹配
<a name="troubleshooting-service-connect-mismatch"></a>

以下问题与 Service Connect 和部署控制器不匹配有关。

在 `EXTERNAL` 控制器上使用 Service Connect  
*错误消息*：`The EXTERNAL deployment controller type is not supported for services using Service Connect.`  
*解决方案*：尝试在启用了 Service Connect 的服务上使用 `EXTERNAL` 部署控制器时，会发生此错误。`EXTERNAL` 控制器与 Service Connect 不兼容。  

1. 检查服务是否启用了 Service Connect：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services your-service-name --query "services[0].serviceConnectConfiguration"
   ```

1. 如果需要使用 `EXTERNAL` 部署控制器，请通过更新服务来禁用 Service Connect：

   ```
   aws ecs update-service --cluster your-cluster-name --service your-service-name --service-connect-configuration "{}"
   ```

1. 或者，如果必须使用 Service Connect，请改用 `ECS` 部署控制器：

   ```
   aws ecs update-service --cluster your-cluster-name --service your-service-name --deployment-controller type=ECS
   ```
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

在非 ECS 控制器上使用 Service Connect  
*错误消息*：`Service Connect feature is only supported with ECS (rolling update) deployment controller. Update to ECS deployment controller and try again.`  
*解决方案*：尝试在未使用 `ECS` 部署控制器的服务上启用 Service Connect 时，会发生此错误。Service Connect 功能仅与 `ECS` 部署控制器兼容。  

1. 检查服务的当前部署控制器：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].deploymentController"
   ```

1. 更新服务以使用 ECS 部署控制器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-controller type=ECS
   ```

1. 服务使用 ECS 部署控制器后，启用 Service Connect：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --service-connect-configuration "enabled=true,namespace=your-namespace"
   ```
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

## 控制器类型和计划策略不匹配
<a name="troubleshooting-controller-type-scheduling"></a>

以下问题与控制器类型和计划策略不匹配有关。

将 `CODE_DEPLOY` 控制器与 `DAEMON` 计划策略结合使用  
*错误消息*：`The CODE_DEPLOY deployment controller type is not supported for services using the DAEMON scheduling strategy.`  
*解决方案*：尝试将 CODE\_DEPLOY 部署控制器与使用 `DAEMON` 计划策略的服务结合使用时，会发生此错误。`CODE_DEPLOY` 控制器仅与 `REPLICA` 计划策略兼容。  

1. 检查服务的当前计划策略：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].schedulingStrategy"
   ```

1. 如果需要蓝绿部署，请将服务更改为使用 `REPLICA` 计划策略：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --scheduling-strategy REPLICA
   ```

1. 或者，如果必须使用 `DAEMON` 计划策略，请改用 `ECS` 部署控制器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-controller type=ECS
   ```
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

将 EXTERNAL 与 DAEMON 计划策略结合使用  
*错误消息*：`The EXTERNAL deployment controller type is not supported for services using the DAEMON scheduling strategy.`  
*解决方案*：尝试将 EXTERNAL 部署控制器与使用 DAEMON 计划策略的 ECS 服务结合使用时，会发生此错误。EXTERNAL 控制器仅与 REPLICA 计划策略兼容。  

1. 检查服务的当前计划策略：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].schedulingStrategy"
   ```

1. 如果需要使用 `EXTERNAL` 部署控制器，请将服务更改为使用 `REPLICA` 调度策略：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --scheduling-strategy REPLICA
   ```

1. 或者，如果必须使用 `DAEMON` 计划策略，请改用 `ECS` 部署控制器：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --deployment-controller type=ECS
   ```
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

具有外部启动类型的服务注册表  
*错误消息*：`Service registries are not supported for external launch type.`  
*解决方案*：尝试为使用 `EXTERNAL` 启动类型的服务配置服务发现（服务注册表）时，会发生此错误。服务发现与 `EXTERNAL` 启动类型不兼容。  

1. 检查服务的当前启动类型：

   ```
   aws ecs describe-services --cluster {{your-cluster-name}} --services {{your-service-name}} --query "services[0].launchType"
   ```

1. 如果需要使用服务发现，请将服务更改为使用 `EC2` 或 `FARGATE` 启动类型：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --launch-type FARGATE
   ```

1. 或者，如果必须使用 `EXTERNAL` 启动类型，请删除服务注册表配置：

   ```
   aws ecs update-service --cluster {{your-cluster-name}} --service {{your-service-name}} --service-registries "[]"
   ```
有关更多信息，请参阅 [Amazon ECS 服务部署控制器和策略](ecs_service-options.md)。

## 恢复部署控制器更新
<a name="troubleshooting-revert"></a>

如果决定要恢复到之前的部署控制器，可以执行以下操作之一：
+ 如果使用的是 Amazon CloudFormation，可以使用之前的模板创建新堆栈。有关更多信息，请参阅《Amazon CloudFormation 用户指南**》中的[通过 CloudFormation 控制台创建堆栈](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。
+ 如果使用的是 Amazon ECS 控制台或 Amazon CLI，可以更新服务。有关更多信息，请参阅 [更新 Amazon ECS 服务](update-service-console-v2.md)。

  如果使用了 update-service 命令，请使用 `--deployment-controller` 选项并将其设置为之前的部署控制器。