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

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

排查 Amazon ECS 部署问题

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

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

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 疑难解答部分,了解与事件消息相关的错误。

等待通知继续时出现超时

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

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

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

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

IAM 角色没有足够的权限

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

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

等待状态回调时部署超时

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

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 函数无法调用必需的 PutLifecycleEventHookExecutionStatus API 来向 CodeDeploy 返回 SucceededFailed 状态,则可能会发生此错误。

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

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

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

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

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

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

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

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

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

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

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

可能的原因:如果您配置了可选的测试侦听器,并且配置了错误的目标组,则可能会出现此错误。有关 CodeDeploy 中测试侦听器的更多信息,请参阅在开始Amazon ECS 部署之前Amazon ECS 部署期间会发生什么。有关任务集的更多信息,请参阅《Amazon Elastic Container Service API 参考》中的 TaskSet 和《Amazon CLI 命令参考》的 Amazon ECS 部分中的 describe-task-set

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

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

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

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

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

注意

CodeDeploy 无法直接调用 RegisterScaleableTarget。要使用此 API,您必须将 CodeDeploy 配置为向 Amazon Simple Notification Service(或 Amazon CloudWatch)发送通知或事件。然后,您必须将 Amazon SNS(或 CloudWatch)配置为调用 Lambda 函数,并配置 Lambda 函数以调用 RegisterScalableTarget API。调用 RegisterScalableTarget API 时必须将 SuspendedState 参数设置为 true 以暂停 Auto Scaling 操作,然后设置为 false 以恢复这些操作。

CodeDeploy 发送的通知或事件必须在部署开始(触发 Auto Scaling 暂停操作)或部署成功、失败或停止(触发 Auto Scaling 恢复操作)时发生。

有关如何配置 CodeDeploy 以生成 Amazon SNS 通知或 CloudWatch 事件的信息,请参阅通过 Amazon CloudWatch Events 监控部署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 一次性部署,并且替换(绿色)任务集包含导致 Elastic Load Balancing 运行状况检查失败的错误代码,则可能会出现此问题。使用一次性部署配置,在流量转移到替换任务集之后(即 CodeDeploy 的 AllowTraffic 生命周期事件发生之后),负载均衡器的运行状况检查将开始对替换任务集运行。这就是为什么在流量转移之后,替换任务集的运行状况检查会失败,而在流量转移前却没有。有关 CodeDeploy 生成的生命周期事件的信息,请参阅Amazon ECS 部署期间会发生什么

可能的修复措施:

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

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

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

    注意

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

  • 如果要保留一次性部署配置,请设置测试侦听器并使用 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 服务?

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

注意

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

  1. 使用您要更新的参数调用 Amazon ECS 的 UpdateService API。有关可以更新的参数的完整列表,请参阅《Amazon Elastic Container Service API 参考》中的 UpdateService

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