

# 关于蓝绿部署
<a name="about-blue-green-deployments"></a>

本主题概述了如何使用 CloudFormation 执行蓝绿部署。此外还介绍了如何准备用于蓝绿部署的 CloudFormation 模板。

**Topics**
+ [工作原理](#blue-green-how-it-works)
+ [会启动绿色部署的资源更新](#blue-green-resources)
+ [准备 模板](#blue-green-setup)
+ [为蓝绿部署建模](#blue-green-required)
+ [更改集](#blue-green-changesets)
+ [监控堆栈事件](#blue-green-events)
+ [IAM 权限](#blue-green-iam)

## 工作原理
<a name="blue-green-how-it-works"></a>

使用 CloudFormation 通过 CodeDeploy 执行 ECS 蓝绿部署时，首先创建一个堆栈模板，用于定义蓝色和绿色应用程序环境的资源，包括指定要使用的流量路由和稳定设置。然后基于该模板创建一个堆栈。这会生成蓝色（当前）应用程序。CloudFormation 仅在堆栈创建过程中创建蓝色资源。绿色部署的资源仅在需要时才会创建。

然后，如果在将来的堆栈更新中更新蓝色应用程序中的任务定义或任务集资源，CloudFormation 会执行以下操作：
+ 生成所有必需的绿色应用程序环境资源
+ 根据指定的流量路由参数转移流量
+ 删除蓝色资源

如果在绿色部署成功和完成之前的任何时刻发生错误，CloudFormation 会将堆栈回滚到启动整个绿色部署之前的状态。

## 会启动绿色部署的资源更新
<a name="blue-green-resources"></a>

执行将会更新特定 ECS 资源的特定属性的堆栈更新时，CloudFormation 将会启动绿色部署过程。将会启动此过程的资源有：
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskset.html) 

但是，如果对这些资源的更新不涉及需要替换的属性更改，则不会启动绿色部署。有关更多信息，请参阅 [理解堆栈资源的更新行为](using-cfn-updating-stacks-update-behaviors.md)。

请注意，不能在同一堆栈更新操作中同时包括对上述资源的更新以及对其他资源的更新。如果需要更新列出的资源以及同一堆栈中的其他资源，则有两种选择：
+ 执行两个单独的堆栈更新操作：一个仅包括对上述资源的更新，另一个单独的堆栈更新包括对任何其他资源的更改。
+ 从模板中删除 `Transform` 和 `Hooks` 部分，然后执行堆栈更新。在这种情况下，CloudFormation 不会执行绿色部署。

## 准备模板以执行 ECS 蓝/绿部署
<a name="blue-green-setup"></a>

要在堆栈上启用蓝/绿部署，请在执行堆栈更新之前在堆栈模板中包含以下部分。
+ 将 `AWS::CodeDeployBlueGreen` 转换的引用添加到模板中：

  ```
  "Transform": [
    "AWS::CodeDeployBlueGreen"
  ],
  ```
+ 添加调用 `AWS::CodeDeploy::BlueGreen` 挂钩并指定部署属性的 `Hooks` 部分。有关更多信息，请参阅 [`AWS::CodeDeploy::BlueGreen` 钩子语法](blue-green-hook-syntax.md)。
+ 在 `Resources` 部分中，定义部署的蓝色和绿色资源。

您可以在第一次创建模板时（即创建堆栈本身之前）添加这些部分，也可以在执行堆栈更新之前将它们添加到现有模板中。如果是为新堆栈指定蓝/绿部署，则 CloudFormation 只在堆栈创建期间创建蓝色资源 - 仅当在堆栈更新期间需要绿色部署的资源时才会创建它们。

## 使用 CloudFormation 资源对蓝/绿部署建模
<a name="blue-green-required"></a>

要在 ECS 上执行 CodeDeploy 蓝绿部署，CloudFormation 模板需要包含为部署建模的资源，例如 Amazon ECS 服务和负载均衡器。如需更详细地了解这些资源代表了什么，请参阅《AWS CodeDeploy 用户指南》中的[开始 Amazon ECS 部署之前](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-steps-ecs.html#deployment-steps-prerequisites-ecs)。


| 要求 | 资源 | 必需/可选 | 如果替换则会启动蓝绿部署？ | 
| --- | --- | --- | --- | 
| Amazon ECS 集群 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-cluster.html) | 可选。可以使用默认集群。 | 否 | 
| Amazon ECS 服务 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-service.html) | 必需。 | 否 | 
| 应用程序或网络负载均衡器 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-service-loadbalancer.html) | 必需。 | 否 | 
| 生产侦听器 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | 必需。 | 否 | 
| 测试侦听器  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-listener.html) | 可选。 | 否 | 
| 两个目标组 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-targetgroup.html) | 必需。 | 否 | 
| Amazon ECS 任务定义  | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-ecs-taskdefinition.html) | 必需。 | 是 | 
| 您的 Amazon ECS 应用程序的容器 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-containerdefinition.html#cfn-ecs-taskdefinition-containerdefinition-name) | 必需。 | 否 | 
| 您的替换任务集的端口 | [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-ecs-taskdefinition-portmapping.html#cfn-ecs-taskdefinition-portmapping-containerport) | 必需。 | 否 | 

## 更改集
<a name="blue-green-changesets"></a>

我们强烈建议您在执行会启动绿色部署的堆栈更新之前创建更改集。这样便于您在执行堆栈更新之前查看对堆栈作出的实际更改。请注意，资源更改可能不会按堆栈更新期间的执行顺序列出。有关更多信息，请参阅 [使用更改集更新 CloudFormation 堆栈](using-cfn-updating-stacks-changesets.md)。

## 监控堆栈事件
<a name="blue-green-events"></a>

您可以在 **Stack**（堆栈）页面的 **Events**（事件）选项卡上，使用 AWS CLI 查看 ECS 部署的每个步骤生成的堆栈事件。有关更多信息，请参阅 [监控堆栈进度](monitor-stack-progress.md)。

## 蓝绿部署所需的 IAM 权限
<a name="blue-green-iam"></a>

为了使 CloudFormation 成功执行蓝绿部署，您必须具有以下 CodeDeploy 权限：
+ `codedeploy:Get*`
+ `codedeploy:CreateCloudFormationDeployment`

有关更多信息，请参阅《服务授权参考》中的 [Actions, resources, and condition keys for CodeDeploy](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscodedeploy.html)**。