

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

# 排查 Amazon ECS 部署问题
<a name="troubleshooting-ecs"></a>

**Topics**
+ [等待替换任务集时出现超时](#troubleshooting-ecs-timeout)
+ [等待通知继续时出现超时](#troubleshooting-ecs-timeout-notif)
+ [IAM 角色没有足够的权限](#troubleshooting-ecs-iam)
+ [等待状态回调时部署超时](#troubleshooting-ecs-timeout-callback)
+ [由于一个或多个生命周期事件验证函数失败，部署失败](#troubleshooting-ecs-lifecycle)
+ [由于以下错误，ELB 无法更新：主任务集目标组必须位于监听器之后](#troubleshooting-ecs-elb)
+ [使用 Auto Scaling 时，我的部署有时会失败](#troubleshooting-ecs-auto-scaling)
+ [只有 ALB 支持渐进式流量路由，在 create/update 部署组时改用 AllAtOnce 流量路由](#troubleshooting-ecs-lb)
+ [尽管我的部署成功了，但替换任务集未通过 Elastic Load Balancing 运行状况检查，而且我的应用程序已关闭](#troubleshooting-ecs-task-set-stability)
+ [我能否将多个负载均衡器连接到一个部署组？](#troubleshooting-ecs-lb-multi)
+ [我能否在没有负载均衡器的情况下执行 CodeDeploy 蓝/绿部署？](#troubleshooting-ecs-lb-bg)
+ [在部署过程中，如何使用新信息更新我的 Amazon ECS 服务？](#troubleshooting-ecs-exec)

## 等待替换任务集时出现超时
<a name="troubleshooting-ecs-timeout"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

`The deployment timed out while waiting for the replacement task set to become healthy. This time out period is 60 minutes.`

**可能的原因**：如果您的任务定义文件或其他与部署相关的文件中存在错误，则可能会出现此错误。例如，如果您的任务定义文件中的 `image` 字段中有拼写错误，Amazon ECS 将尝试提取错误的容器映像并持续失败，从而导致此错误。

**可能的解决方法和后续步骤**：
+ 修复任务定义文件和其他文件中的排版错误和配置问题。
+ 查看相关的 Amazon ECS 服务事件，找出替换任务无法正常运行的原因。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 事件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html)。
+ 请查看《Amazon Elastic Container Service 开发人员指南》**中的 [Amazon ECS 疑难解答](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshooting.html)部分，了解与事件消息相关的错误。

## 等待通知继续时出现超时
<a name="troubleshooting-ecs-timeout-notif"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

 `The deployment timed out while waiting for a notification to continue. This time out period is n minutes.` 

**可能的原因**：如果您在创建部署组时在**指定重新路由流量的时间**字段中指定了等待时间，但是在等待时间结束之前部署未能完成，则可能会发生此错误。

**可能的解决方法和后续步骤**：
+ 在您的部署组中，将**指定重新路由流量的时间**设置为更长的时间并重新部署。有关更多信息，请参阅 [为 Amazon ECS 部署创建部署组（控制台）](deployment-groups-create-ecs.md)。
+ 在您的部署组中，将**指定重新路由流量的时间设置**更改为**立即重新路由流量**并重新部署。有关更多信息，请参阅 [为 Amazon ECS 部署创建部署组（控制台）](deployment-groups-create-ecs.md)。
+ 重新部署，然后在`--deployment-wait-type`选项设置为`READY_WAIT`的情况下运行[https://docs.aws.amazon.com/cli/latest/reference/deploy/continue-deployment.html](https://docs.aws.amazon.com/cli/latest/reference/deploy/continue-deployment.html) AWS CLI 命令。确保在**指定重新路由流量的时间**中指定的时间结束*之前* 运行此命令。

## IAM 角色没有足够的权限
<a name="troubleshooting-ecs-iam"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

 `The IAM role role-arn does not give you permission to perform operations in the following AWS service: AWSLambda.` 

**可能的原因**：如果您在[AppSpec 文件`Hooks`部分](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)指定了 Lambda 函数，但未 CodeDeploy 授予 Lambda 服务的权限，则可能会发生此错误。

**可能的解决方法**：为 CodeDeploy 服务角色添加`lambda:InvokeFunction`权限。要添加此权限，请向该角色添加以下 AWS托管策略之一：**AWSCodeDeployRoleForECS** 或 **AWSCodeDeployRoleForECSLimited**。有关这些策略以及如何将其添加到 CodeDeploy 服务角色的信息，请参阅[步骤 2：为创建服务角色 CodeDeploy](getting-started-create-service-role.md)。

## 等待状态回调时部署超时
<a name="troubleshooting-ecs-timeout-callback"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

 `The deployment timed out while waiting for a status callback. CodeDeploy expects a status callback within one hour after a deployment hook is invoked.` 

**可能的原因**：如果您在[AppSpec 文件`Hooks`部分指定了 Lambda 函数，但是 Lambda `Succeeded` 函数无法调用必要的](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs) `PutLifecycleEventHookExecutionStatus` API 来返回或状态，则可能会发生此错误。`Failed` CodeDeploy

**可能的解决方法和后续步骤**：
+ 向您在文件中指定的 Lambda 函数使用的 Lambda 执行角色添加`codedeploy:putlifecycleEventHookExecutionStatus`权限。 AppSpec 此权限授予 Lambda 函数返回`Succeeded`或`Failed`状态的功能。 CodeDeploy有关 Lambda 执行角色的更多信息，请参阅《AWS Lambda 用户指南》**中的 [Lambda 执行角色](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。
+ 检查您的 Lambda 函数代码和执行日志，确保您的 Lambda 函数正在调用 CodeDeploy的 `PutLifecycleEventHookExecutionStatus` API，以告 CodeDeploy知生命周期验证测试是否还是。`Succeeded` `Failed`有关 `putlifecycleEventHookExecutionStatus` API 的信息，请参阅 *AWS CodeDeploy API 参考[PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)*中的。有关 Lambda 执行日志的信息，请参阅访问[亚马逊 CloudWatch 日志](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html)。 AWS Lambda

## 由于一个或多个生命周期事件验证函数失败，部署失败
<a name="troubleshooting-ecs-lifecycle"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

`The deployment failed because one or more of the lifecycle event validation functions failed.`

**可能的原因**：如果您在[AppSpec 文件`Hooks`部分](reference-appspec-file-structure-hooks.md#appspec-hooks-ecs)指定了 Lambda 函数，但是 Lambda 函数在调用时却返回`Failed`到 CodeDeploy 该函数，则可能会发生此错误。`PutLifecycleEventHookExecutionStatus`此失败 CodeDeploy 表示生命周期验证测试失败。

**下一步可能采取的措施**：检查您的 Lambda 执行日志，了解验证测试代码失败的原因。有关 Lambda 执行日志的信息，请参阅访问[亚马逊 CloudWatch 日志](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html)。 AWS Lambda

## 由于以下错误，ELB 无法更新：主任务集目标组必须位于监听器之后
<a name="troubleshooting-ecs-elb"></a>

**问题**：在使用以下方式部署 Amazon ECS 应用程序时，您会看到以下错误消息 CodeDeploy：

`The ELB could not be updated due to the following error: Primary taskset target group must be behind listener`

**可能的原因**：如果您配置了可选的测试侦听器，并且配置了错误的目标组，则可能会出现此错误。有关中测试侦听器的更多信息 CodeDeploy，请参见[在开始 Amazon ECS 部署之前](deployment-steps-ecs.md#deployment-steps-prerequisites-ecs)和[在 Amazon ECS 部署过程中发生的事件](deployment-steps-ecs.md#deployment-steps-what-happens)。有关任务集的更多信息，请参阅[TaskSet](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskSet.html)《*亚马逊弹性容器服务 API 参考*》和[describe-task-set](https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-task-set.html)《*AWS CLI 命令参考*》的 Amazon ECS 部分。

**可能的解决方法**：确保 Elastic Load Balancing 的生产侦听器和测试侦听器都指向当前为您的工作负载提供服务的目标组。有三个地方需要检查：
+ 在 Amazon EC2 中，在您的负载均衡器的**侦听器和规则**设置中。有关更多信息，请参阅《应用程序负载均衡器用户指南》**中的[应用程序负载均衡器侦听器](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-listeners.html)，或《网络负载均衡器用户指南》**中的[网络负载均衡器侦听器](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-listeners.html)。
+ 在 Amazon ECS 中，在您的集群中的服务的**网络**配置下。有关更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[应用程序负载均衡器和网络负载均衡器注意事项](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/load-balancer-types.html#alb-considerations)。
+ 在 CodeDeploy您的部署组设置中。有关更多信息，请参阅 [为 Amazon ECS 部署创建部署组（控制台）](deployment-groups-create-ecs.md)。

## 使用 Auto Scaling 时，我的部署有时会失败
<a name="troubleshooting-ecs-auto-scaling"></a>

**问题**：您正在将 Auto Scaling CodeDeploy 与一起使用，但发现部署偶尔会失败。有关此问题症状的更多信息，请参阅《*Amazon Elastic Container Service 开发者指南》中标题为 “对于配置为使用服务自动扩展的服务*[以及 blue/green 部署类型，在部署期间不会阻止自动扩展，但在某些情况下部署可能会失败](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-bluegreen.html#deployment-type-bluegreen-considerations)。

**可能的原因**：如果 CodeDeploy 和 Auto Scaling 进程发生冲突，则可能会出现此问题。

**可能的解决方法**：在 CodeDeploy 部署期间使用 `RegisterScalableTarget` API（或相应的`register-scalable-target` AWS CLI 命令）暂停和恢复 Auto Scaling 进程。有关更多信息，请参阅《Application Auto Scaling 用户指南》**中的[暂停和恢复 Application Auto Scaling 扩缩](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-suspend-resume-scaling.html)。

**注意**  
CodeDeploy 无法`RegisterScaleableTarget`直接打电话。要使用此 API，您必须配置 CodeDeploy 为向亚马逊简单通知服务（或亚马逊 CloudWatch）发送通知或事件。然后，您必须将 Amazon SNS（或 CloudWatch）配置为调用 Lambda 函数，并配置 Lambda 函数以调用该 API。`RegisterScalableTarget`调用 `RegisterScalableTarget` API 时必须将 `SuspendedState` 参数设置为 `true` 以暂停 Auto Scaling 操作，然后设置为 `false` 以恢复这些操作。  
 CodeDeploy 发送的通知或事件必须在部署开始（触发 Auto Scaling 暂停操作）或部署成功、失败或停止（触发 Auto Scaling 恢复操作）时发生。  
有关如何配置 CodeDeploy 以生成 Amazon SNS 通知或 CloudWatch事件的信息，请参阅[使用 Amazon CloudWatch 事件监控部署](monitoring-cloudwatch-events.md)。和。[使用 Amazon SNS 事件通知监控部署](monitoring-sns-event-notifications.md)

## 只有 ALB 支持渐进式流量路由，在 create/update 部署组时改用 AllAtOnce 流量路由
<a name="troubleshooting-ecs-lb"></a>

**问题**：在中创建或更新部署组时，您会看到以下错误消息 CodeDeploy：

 `Only ALB supports gradual traffic routing, use AllAtOnce Traffic routing instead when you create/update Deployment group.` 

**可能的原因**：如果您使用的是网络负载均衡器并尝试使用除 `CodeDeployDefault.ECSAllAtOnce` 之外的预定义部署配置，则可能会发生此错误。

**可能的修复方法：**
+ 将您的预定义部署配置更改为 `CodeDeployDefault.ECSAllAtOnce`。这是网络负载均衡器支持的唯一预定义部署配置。

  有关预定义部署配置的更多信息，请参阅[Amazon ECS 计算平台的预定义部署配置](deployment-configurations.md#deployment-configurations-predefined-ecs)。
+ 将您的负载均衡器更改为应用程序负载均衡器。应用程序负载均衡器支持所有预定义的部署配置。有关创建应用程序负载均衡器的更多信息，请参阅[为 A CodeDeploy mazon ECS 部署设置负载均衡器、目标组和侦听器](deployment-groups-create-load-balancer-for-ecs.md)。

## 尽管我的部署成功了，但替换任务集未通过 Elastic Load Balancing 运行状况检查，而且我的应用程序已关闭
<a name="troubleshooting-ecs-task-set-stability"></a>

**问题**：尽管 CodeDeploy 表明我的部署成功，但替换任务集未通过 Elastic Load Balancing 的运行状况检查，并且我的应用程序已关闭。

**可能的原因**：如果您执行了 CodeDeploy all-at-once 部署，并且您的替换（绿色）任务集包含导致 Elastic Load Balancing 运行状况检查失败的错误代码，则可能会出现此问题。*使用 all-at-once部署配置，在流量转移到替换任务集*之后（也就是说，`AllowTraffic`生命周期事件发生之后*），负载均衡器的运行状况检查就会开始 CodeDeploy对替换任务集运行。*这就是为什么在流量转移之后，替换任务集的运行状况检查会失败，而在流量转移前却没有。有关 CodeDeploy 生成的生命周期事件的信息，请参阅[在 Amazon ECS 部署过程中发生的事件](deployment-steps-ecs.md#deployment-steps-what-happens)。

**可能的修复方法：**
+ 将部署配置从更改 all-at-once为灰色或线性。*在灰度或线性配置中，在替换环境中 CodeDeploy 安装应用程序时，在流量转移之前（即`Install`生命周期事件期间和事件发生*之前*），负载均衡器的运行状况检查开始在替换任务集上`AllowTraffic`运行。*通过允许在应用程序安装期间但在流量转移之前运行检查，可以在应用程序公开可用之前检测到错误的应用程序代码并导致部署失败。

  有关如何配置金丝雀部署或线性部署的信息，请参阅[使用更改部署组设置 CodeDeploy](deployment-groups-edit.md)。

  有关在 Amazon ECS 部署期间运行的 CodeDeploy 生命周期事件的信息，请参阅[在 Amazon ECS 部署过程中发生的事件](deployment-steps-ecs.md#deployment-steps-what-happens)。
**注意**  
只有应用程序负载均衡器支持金丝雀和线性部署配置。
+ 如果要保留 all-at-once部署配置，请设置测试侦听器并使用`BeforeAllowTraffic`生命周期挂钩检查替换任务集的运行状况。有关更多信息，请参阅 [用于 Amazon ECS 部署的生命周期事件挂钩的列表](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs)。

## 我能否将多个负载均衡器连接到一个部署组？
<a name="troubleshooting-ecs-lb-multi"></a>

不是。 如果您想使用多个应用程序负载均衡器或网络负载均衡器，请使用 Amazon ECS 滚动更新而不是 CodeDeploy 蓝/绿部署。有关滚动更新的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[滚动更新](https://docs.aws.amazon.com/AmazonECS/latest/userguide/deployment-type-ecs.html)。有关对 Amazon ECS 使用多个负载均衡器的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[向服务注册多个目标组](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html)。

## 我能否在没有负载均衡器的情况下执行 CodeDeploy 蓝/绿部署？
<a name="troubleshooting-ecs-lb-bg"></a>

不，如果没有负载均衡器，则无法执行 CodeDeploy 蓝/绿部署。如果您无法使用负载均衡器，请改用 Amazon ECS 的滚动更新功能。有关 Amazon ECS 滚动更新的更多信息，请参阅《Amazon Elastic Container Service 开发人员指南》**中的[滚动更新](https://docs.aws.amazon.com/AmazonECS/latest/userguide/deployment-type-ecs.html)。

## 在部署过程中，如何使用新信息更新我的 Amazon ECS 服务？
<a name="troubleshooting-ecs-exec"></a>

要在您的 Amazon ECS 服务进行部署时使用新参数对其进行 CodeDeploy 更新，请在 AppSpec 文件`resources`部分中指定该参数。仅支持少数 Amazon ECS 参数 CodeDeploy，例如任务定义文件和容器名称参数。有关 CodeDeploy 可以更新的 Amazon ECS 参数的完整列表，请参阅[AppSpec Amazon ECS 部署的 “资源” 部分](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs)。

**注意**  
如果您需要使用不支持的参数更新 Amazon ECS 服务 CodeDeploy，请完成以下任务：  
使用您要更新的参数调用 Amazon ECS 的 `UpdateService` API。有关可更新的参数的完整列表，请参阅[UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html)《*亚马逊弹性容器服务 API 参考*》。
要将更改应用于任务，请创建新的 Amazon ECS blue/green 部署。有关更多信息，请参阅 [创建 Amazon ECS 计算平台部署（控制台）](deployments-create-console-ecs.md)。