排查 Amazon ECS 部署问题 - Amazon CodeDeploy
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

排查 Amazon ECS 部署问题

等待替换任务集时出现超时

问题:在使用以下方式部署 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 事件

  • 请查看《Amazon Elastic Container Service 开发人员指南》中的 Amazon ECS 疑难解答部分,了解与事件消息相关的错误。

等待通知继续时出现超时

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

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

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

可能的解决方法和后续步骤

IAM 角色没有足够的权限

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

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

可能的原因:如果您在AppSpec 文件Hooks部分指定了 Lambda 函数,但未 CodeDeploy 授予 Lambda 服务的权限,则可能会发生此错误。

可能的解决方法:为 CodeDeploy 服务角色添加lambda:InvokeFunction权限。要添加此权限,请向该角色添加以下 Amazon托管策略之一:AWSCodeDeployRoleForECSAWSCodeDeployRoleForECSLimited。有关这些策略以及如何将其添加到 CodeDeploy 服务角色的信息,请参阅步骤 2:为创建服务角色 CodeDeploy

等待状态回调时部署超时

问题:在使用以下方式部署 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 函数无法调用必要的 PutLifecycleEventHookExecutionStatus API 来返回或状态,则可能会发生此错误。Failed CodeDeploy

可能的解决方法和后续步骤

  • 向您在文件中指定的 Lambda 函数使用的 Lambda 执行角色添加codedeploy:putlifecycleEventHookExecutionStatus权限。 AppSpec 此权限授予 Lambda 函数返回SucceededFailed状态的功能。 CodeDeploy有关 Lambda 执行角色的更多信息,请参阅《Amazon Lambda 用户指南》中的 Lambda 执行角色

  • 检查您的 Lambda 函数代码和执行日志,确保您的 Lambda 函数正在调用 CodeDeploy的 PutLifecycleEventHookExecutionStatus API,以告 CodeDeploy知生命周期验证测试是否还是。Succeeded Failed有关 putlifecycleEventHookExecutionStatus API 的信息,请参阅 Amazon CodeDeploy API 参考PutLifecycleEventHookExecutionStatus中的。有关 Lambda 执行日志的信息,请参阅访问亚马逊 CloudWatch 日志。 Amazon Lambda

由于一个或多个生命周期事件验证函数失败,部署失败

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

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

可能的原因:如果您在AppSpec 文件Hooks部分中指定了 Lambda 函数,但是 Lambda 函数在调用时返回Failed到 CodeDeploy ,则可能会发生此错误。PutLifecycleEventHookExecutionStatus此失败 CodeDeploy 表示生命周期验证测试失败。

下一步可能采取的措施:检查您的 Lambda 执行日志,了解验证测试代码失败的原因。有关 Lambda 执行日志的信息,请参阅访问亚马逊 CloudWatch 日志。 Amazon Lambda

由于以下错误,ELB 无法更新:主任务集目标组必须位于监听器之后

问题:在使用以下方式部署 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 部署之前在 Amazon ECS 部署过程中发生的事件。有关任务集的更多信息,请参阅TaskSet亚马逊弹性容器服务 API 参考》和describe-task-setAmazon CLI 命令参考》的 Amazon ECS 部分。

可能的解决方法:确保 Elastic Load Balancing 的生产侦听器和测试侦听器都指向当前为您的工作负载提供服务的目标组。有三个地方需要检查:

使用 Auto Scaling 时,我的部署有时会失败

问题:您正在将 Auto Scaling CodeDeploy 与一起使用,但发现部署偶尔会失败。有关此问题症状的详细信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的主题对于配置为使用服务自动扩缩和蓝绿部署类型的服务,在部署期间不会阻止自动扩缩,但在某些情况下部署可能会失败

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

可能的解决方法:在 CodeDeploy 部署期间使用 RegisterScalableTarget API(或相应的register-scalable-target Amazon CLI 命令)暂停和恢复 Auto Scaling 进程。有关更多信息,请参阅《Application Auto Scaling 用户指南》中的暂停和恢复 Application Auto Scaling 扩缩

注意

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 Deployments with Amazon SNS Event Notifications

只有 ALB 支持渐进式流量路由,创建/更新部署组时请改用 AllAtOnce 流量路由

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

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

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

可能的修复措施:

尽管我的部署成功了,但替换任务集未通过 Elastic Load Balancing 运行状况检查,而且我的应用程序已关闭

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

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

可能的修复措施:

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

    有关如何配置金丝雀部署或线性部署的信息,请参阅使用更改部署组设置 CodeDeploy

    有关在 Amazon ECS 部署期间运行的 CodeDeploy 生命周期事件的信息,请参阅在 Amazon ECS 部署过程中发生的事件

    注意

    只有应用程序负载均衡器支持金丝雀和线性部署配置。

  • 如果要保留 all-at-once 部署配置,请设置测试侦听器并使用BeforeAllowTraffic生命周期挂钩检查替换任务集的运行状况。有关更多信息,请参阅 用于 Amazon ECS 部署的生命周期事件挂钩的列表

我能否将多个负载均衡器连接到一个部署组?

不是。 如果您想使用多个应用程序负载均衡器或网络负载均衡器,请使用 Amazon ECS 滚动更新而不是 CodeDeploy 蓝/绿部署。有关滚动更新的更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的滚动更新。有关对 Amazon ECS 使用多个负载均衡器的更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的向服务注册多个目标组

我能否在没有负载均衡器的情况下执行 CodeDeploy 蓝/绿部署?

不,如果没有负载均衡器,则无法执行 CodeDeploy 蓝/绿部署。如果您无法使用负载均衡器,请改用 Amazon ECS 的滚动更新功能。有关 Amazon ECS 滚动更新的更多信息,请参阅《Amazon Elastic Container Service 开发人员指南》中的滚动更新

在部署过程中,如何使用新信息更新我的 Amazon ECS 服务?

要在您的 Amazon ECS 服务进行部署时使用新参数对其进行 CodeDeploy 更新,请在 AppSpec 文件resources部分中指定该参数。仅支持少数 Amazon ECS 参数 CodeDeploy,例如任务定义文件和容器名称参数。有关 CodeDeploy 可以更新的 Amazon ECS 参数的完整列表,请参阅 AppSpec Amazon ECS 部署的 “资源” 部分

注意

如果您需要使用不支持的参数更新 Amazon ECS 服务 CodeDeploy,请完成以下任务:

  1. 使用您要更新的参数调用 Amazon ECS 的 UpdateService API。有关可更新的参数的完整列表,请参阅UpdateService亚马逊弹性容器服务 API 参考》。

  2. 要将更改应用于任务,请创建一个新的 Amazon ECS 蓝绿部署。有关更多信息,请参阅 创建 Amazon ECS 计算平台部署(控制台)