

# Amazon ECS 蓝绿服务部署工作流
<a name="blue-green-deployment-how-it-works"></a>

Amazon ECS 蓝绿部署过程遵循结构化方法，包含六个不同的阶段，可确保安全可靠地进行应用程序更新。在验证应用程序并将其从当前版本（蓝色环境）迁移到新版本（绿色环境）时，每个阶段都有其特定目的。

1. **准备阶段**：在现有的蓝色环境旁创建绿色环境。这包括配置新的服务修订版以及准备目标组。

1. **部署阶段**：将新的服务修订版部署到绿色环境。Amazon ECS 使用更新的服务修订版启动新任务，同时蓝色环境继续传送生产流量。

1. **测试阶段**：使用测试流量路由来验证绿色环境。应用程序负载均衡器将测试请求定向到绿色环境，而生产流量仍保留在蓝色环境中。

1. **流量转移阶段**：根据所配置的部署策略，将生产流量从蓝色环境转移到绿色环境。此阶段包括监控和验证检查点。

1. **监控阶段**：监控烘焙时间内的应用程序运行状况、性能指标和警报状态。检测到问题时将启动回滚操作。

1. **完成阶段**：根据配置，通过终止蓝色环境或针对潜在的回滚场景对其进行维护来完成部署。

## 工作流
<a name="blue-green-deployment-workflow"></a>

下图阐明了全面的蓝绿部署工作流，显示了 Amazon ECS 与应用程序负载均衡器之间的交互：

![\[展示 Amazon ECS 中蓝绿部署过程的综合图，包含详细的组件交互、流量转移阶段和监控检查点\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/blue-green.png)


增强型部署工作流包括以下详细步骤：

1. **初始状态**：蓝色服务（当前生产环境）处理 100% 的生产流量。应用程序负载均衡器只有一个侦听器，其规则可将所有请求路由到包含正常运行的蓝色任务的蓝色目标组。

1. **绿色环境预置**：Amazon ECS 使用更新的任务定义创建新任务。这些任务已注册到新的绿色目标组，但最初不会接收任何流量。

1. **运行状况检查验证**：应用程序负载均衡器对绿色任务执行运行状况检查。仅当绿色任务通过运行状况检查后，部署才会进入下一阶段。

1. **测试流量路由**：若已配置，则应用程序负载均衡器的侦听器规则会将特定的流量模式（例如带有测试标头的请求）路由到绿色环境进行验证，而生产流量仍将保留在蓝色环境中。这是由处理生产流量的同一个侦听器控制的，它将根据请求属性使用不同的规则。

1. **生产流量转移**：根据部署配置，流量从蓝色环境转移到绿色环境。在 ECS 蓝绿部署中，这是一种即时（一次性）转移，100% 的流量都将从蓝色环境转移到绿色环境。应用程序负载均衡器仅使用一个具有侦听器规则的侦听器，这些规则将根据权重控制蓝色目标组与绿色目标组之间的流量分配。

1. **监控与验证**：在整个流量转移过程中，Amazon ECS 会监控 CloudWatch 指标、警报状态和部署运行状况。如果检测到问题，将启动自动回滚触发器。

1. **烘焙时间段**：生产流量转移后，蓝色服务修订版和绿色服务修订版同时运行的持续时间。

1. **蓝色环境终止**：成功进行流量转移并验证后，将终止蓝色环境以释放集群资源，或将维护蓝色环境以实现快速回滚功能。

1. **最终状态**：绿色环境成为新的生产环境，可处理 100% 的流量。部署将标记为成功。

## 部署生命周期阶段
<a name="blue-green-deployment-stages"></a>

蓝绿部署过程会经历不同的生命周期阶段（即部署操作中的一系列事件，例如“生产流量转移后”），每个阶段都有特定职责和验证检查点。了解这些阶段有助于监控部署进度并有效排查问题。

 每个生命周期阶段最多可持续 24 小时。建议将该值保持在 24 小时以内。这是因为异步进程需要时间来触发挂钩。当一个阶段达到 24 小时后，系统将超时，导致部署失败，然后会启动回滚。此外，CloudFormation 部署还有其他超时限制。尽管 24 小时的阶段限制仍然有效，但 CloudFormation 会对整个部署强制执行 36 小时的限制。如果整个过程未在 36 小时内完成，CloudFormation 将使部署失败，然后启动回滚。


| 生命周期阶段 | 说明 | 此阶段是否使用生命周期挂钩？ | 
| --- | --- | --- | 
| RECONCILE\$1SERVICE | 仅当启动多个服务修订版处于活动状态的新服务部署时，才会发生此阶段。 | 是 | 
| PRE\$1SCALE\$1UP | 绿色服务修订版尚未启动。蓝色服务修订版正在处理 100% 的生产流量。没有测试流量。 | 是 | 
| SCALE\$1UP | 绿色服务修订版纵向扩展至 100% 并启动新任务的时间。此时绿色服务修订版不传送任何流量。 | 否 | 
| POST\$1SCALE\$1UP | 绿色服务修订版已经启动。蓝色服务修订版正在处理 100% 的生产流量。没有测试流量。 | 是 | 
| TEST\$1TRAFFIC\$1SHIFT | 蓝色服务修订版和绿色服务修订版正在运行。蓝色服务修订版可处理 100% 的生产流量。绿色服务修订版正在将测试流量从 0% 迁移到 100%。 | 是 | 
| POST\$1TEST\$1TRAFFIC\$1SHIFT | 测试流量转移已完成。绿色服务修订版可处理 100% 的测试流量。 | 是 | 
| PRODUCTION\$1TRAFFIC\$1SHIFT | 生产流量正在向绿色服务修订版转移。绿色服务修订版正在将生产流量从 0% 迁移到 100%。 | 是 | 
| POST\$1PRODUCTION\$1TRAFFIC\$1SHIFT | 生产流量转移已完成。 | 是 | 
| BAKE\$1TIME | 蓝色服务修订版和绿色服务修订版同时运行的持续时间。 | 否 | 
| CLEAN\$1UP | 蓝色服务修订版已完全缩减至 0 个运行任务。在此阶段之后，绿色服务修订版将成为生产服务修订版。 | 否 | 

每个生命周期阶段皆包含内置的验证检查点，必须通过这些检查点才能进入下一阶段。如果出现任何验证失败，则可以自动回滚部署以保持服务的可用性和可靠性。

当您使用 Lambda 函数时，该函数必须完成工作，或者在 15 分钟内返回 IN\$1PROGRESS。您可以使用 `callBackDelaySeconds` 来延迟对 Lambda 的调用。有关更多信息，请参阅 GitHub 上的 sample-amazon-ecs-blue-green-deployment-patterns 中的 [app.py 函数](https://github.com/aws-samples/sample-amazon-ecs-blue-green-deployment-patterns/blob/main/ecs-bluegreen-lifecycle-hooks/src/approvalFunction/app.py#L20-L25)。