如何对 Amazon ECS 中的蓝/绿部署相关问题进行故障排除?

上次更新日期: 2022 年 4 月 13 日

我想对 Amazon Elastic Container Service (Amazon ECS) 上托管服务的蓝/绿部署相关问题进行故障排除。

简短描述

以下是与 Amazon ECS 上托管服务的蓝/绿部署相关的最常见问题:

AWS Identity and Access Management (IAM) 相关问题:

  • 您无法创建 ECS 服务,因为您遇到此错误: 请为 CodeDeploy 创建服务角色
  • 您遇到此错误: 服务 未能启动任务(显示错误: ECS 无法代入为此任务提供的角色 。请验证传递的角色是否具有适当的信任关系和权限,以及您的 IAM 用户是否有权限传递此角色)

负载均衡器/ECS 相关问题:

  • 由于未通过运行状况检查,您的 ECS 服务未能稳定。
  • 您遇到此错误: 由于以下错误: 主任务集目标组必须在侦听器 之后,ELB 无法进行更新
  • 成功部署后,流量仍会路由到蓝目标组。
  • ECS 服务中运行的 ECS 任务仅在新的绿部署期间未通过 Application Load Balancer 运行状况检查。
  • 您的 ECS 任务未统一通过 Application Load Balancer 运行状况检查。
  • 您的 ECS 服务无法放置任务,因为没有容器实例满足所有要求。匹配程度最高的容器实例没有足够的 CPU 单元可用。

AWS CloudFormation 相关问题(如果您正在通过 CloudFormation 执行蓝/绿部署):

  • 创建触发蓝/绿部署的更改集时,CloudFormation 堆栈发生故障,并显示内部故障错误。
  • 您在创建触发蓝/绿部署的更改集时遇到错误: 类型 AWS::CodeDeploy::BlueGreen 的“CodeDeployBlueGreenHook”发生故障,并显示消息: 初始模板和最终模板之间的 TaskDefinition 逻辑 Id [ ] 相同,CodeDeploy 无法正确执行 BlueGreen 样式更新

解决方法

您无法创建 ECS 服务,因为您遇到此错误: 请为 CodeDeploy 创建服务角色:

由于 AWS CodeDeploy 没有操作蓝/绿部署策略所需的 IAM 权限,您遇到此错误。您必须向 CodeDeploy 服务授予权限才能代表您更新 Amazon ECS 服务。

要对此错误进行故障排除,请验证您的 CodeDeploy IAM 角色是否已正确创建并拥有所需的权限。

要为 CodeDeploy 创建 IAM 角色,请执行以下操作:

  1. 打开 IAM console(IAM 控制台)。
  2. 在导航窗格中,选择 Roles(角色)。
  3. 选择 Create role(创建角色)
  4. Select type of trusted entity(选择受信任实体的类型)部分,选择 AWS service(AWS 服务),然后选择 CodeDeploy
  5. Select your use case(选择使用案例)部分,选择 CodeDeploy - ECS,然后选择 Next:Permissions(下一步:权限)。
    注意:请保留默认的 AWSCodeDeployforECS 策略。此策略包含 CodeDeploy 与 Amazon ECS 及其他服务正确交互所需的权限。
  6. 选择 Next: Tags(下一步: 标签)。
  7. (可选)输入标签名称,然后选择 Next: Review(下一步: 查看)。
  8. 对于 Role name(角色名称),请输入 ecsCodeDeployRole
  9. 选择 Create role(创建角色)。

您遇到此错误: 服务无法启动任务(显示错误: ECS 无法代入为此任务提供的角色: 请验证传递的 IAM 角色是否具有适当的信任关系和权限,以及您的 IAM 用户是否有权限传递此角色):

检查错误消息返回的 IAM 角色,以确保 Amazon Elastic Compute Cloud (Amazon EC2) 实例与 ECS 任务服务 ecs-tasks.amazonaws.com 具有信任关系。您角色的信任关系必须与以下内容类似:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ec2.amazonaws.com",
          "ecs-tasks.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
  • 由于未通过运行状况检查,您的 ECS 服务未能稳定: 请确保任务定义的端口映射与目标组的端口匹配。有关更多信息,请参阅如何让使用 Amazon EC2 启动类型运行的 Amazon ECS 任务通过 Amazon ECS 中的 Application Load Balancer 运行状况检查?
  • 您遇到错误: 错误消息: 由于以下错误,ELB 无法进行更新: 主任务集目标组必须在侦听器之后: 当 Elastic Load Balancing 侦听器或目标组配置错误时会出现此错误。请确保 ELB 主侦听器和测试侦听器都指向当前为您的工作负载提供服务的主目标组。
  • 成功部署后,流量仍会路由到蓝目标组: 在完成部署后,CodeDeploy 会自动更新负载均衡器的主侦听器以指向绿目标组。但是,CodeDeploy 仅更新您指定的生产侦听器。如果 CodeDeploy 在部署后未能切换流量,则您的 ELB 侦听器可能配置了错误的流量类型。请确保为主 ELB 侦听器指定正确的协议和端口。
  • ECS 服务中运行的 ECS 任务仅在新的绿部署期间未通过 Application Load Balancer 运行状况检查: 检查是否有任何其他 ECS 服务正在尝试将其任务注册到同一个绿目标组,进而导致冲突。更新负载均衡器配置,以确保一个目标组仅注册一个 ECS 服务或端口。
  • 您的 ECS 任务未统一通过 Application Load Balancer 运行状况检查: 当您的容器启动时间超过预期时间时,可能会发生此问题。检查您的容器应用程序代码以查找延迟原因。要解决此问题,请优化应用程序代码。如果您仍然无法解决问题,请在 ECS 服务中包括运行状况检查宽限期,以便容器有足够的启动时间。
  • 您的 ECS 服务无法放置任务,因为没有容器实例满足其所有要求。匹配程度最高的容器实例没有足够的 CPU 单元可用: 在执行蓝/绿部署之前,请确保您有足够的容器实例资源。

注意: 这些故障排除步骤仅适用于您使用 CloudFormation 进行蓝/绿部署的情况

  • 创建触发蓝/绿部署的更改集时,CloudFormation 堆栈发生故障,并显示内部故障错误: 要缓解此问题,请使用 CloudFormation 服务角色并将此角色附加到您的 CloudFormation 堆栈。请确保服务角色拥有运行所有堆栈操作的必要权限。请注意,创建堆栈后,您无法从堆栈中删除服务角色。
  • 您在创建触发蓝/绿部署的更改集时遇到错误: 类型 AWS::CodeDeploy::BlueGreen 的“CodeDeployBlueGreenHook”发生故障,并显示消息: 初始模板和最终模板之间的 TaskDefinition 逻辑 Id [ ] 相同,CodeDeploy 无法正确执行 BlueGreen 样式更新: 当您指定已指向绿目标组的测试侦听器时,CodeDeploy 挂钩会发生故障,显示此错误。在运行蓝/绿部署之前,请确保测试侦听器尚未指向绿目标组。

重要提示: 请勿使用 UpdateService API 取消和回滚蓝/绿部署。请使用 CreateDeployment API。要回滚部署,请使用部署 StopDeployment API。