

# 适用于 Amazon ECS 的 CodeDeploy 蓝绿部署
<a name="deployment-type-bluegreen"></a>

建议使用 Amazon ECS 蓝绿部署。有关更多信息，请参阅 [创建 Amazon ECS 蓝绿部署](deploy-blue-green-service.md)。

*蓝/绿*部署类型使用由 CodeDeploy 控制的蓝/绿部署模型。在向服务发送生产流量之前，请使用此部署类型验证服务的新部署。有关更多信息，请参阅《AWS CodeDeploy 用户指南》**中的[什么是 CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/welcome.html)。在部署前验证 Amazon ECS 服务的状态

在蓝绿部署过程中，有三种可转移流量的方法：
+ **金丝雀**：流量将通过两次递增进行转移。您可以从预定义的金丝雀选项中选择，这些选项指定在第一次增量中转移到更新后的任务集的流量百分比以及以分钟为单位的间隔；然后指定在第二次增量中转移剩余的流量。
+ **线性部署** — 流量使用相等的增量转移，在每次递增之间间隔的分钟数相同。您可以从预定义的线性选项中进行选择，这些选项指定在每次增量中转移的流量百分比以及每次增量之间的分钟数。
+ **一次性部署** – 所有流量均从原始任务集一次性地转移到更新后的任务集。

以下是在服务使用蓝/绿部署类型时，Amazon ECS 使用的 CodeDeploy 的组件：

**CodeDeploy 应用程序**  
CodeDeploy 资源集合。这包括一个或多个部署组。

**CodeDeploy 部署组**  
部署设置。这包括以下内容：  
+ Amazon ECS 集群和服务
+ 负载均衡器目标组和侦听器信息
+ 部署回滚策略
+ 流量重新路由设置
+ 原始修订终止设置
+ 部署配置
+ 可设置为停止部署的 CloudWatch 警报配置
+ SNS 或 CloudWatch Events 设置
有关更多信息，请参阅 *AWS CodeDeploy用户手册*中的[使用部署组](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-groups.html)。

**CodeDeploy 部署配置**  
指定在部署期间 CodeDeploy 如何将生产流量路由到您的替换任务集。提供了以下预定义的线性和金丝雀部署配置。您还可以创建自定义的线性和金丝雀部署。有关详细信息，请参见*AWS CodeDeploy 用户手册*中的[使用部署配置](https://docs.aws.amazon.com/codedeploy/latest/userguide/deployment-configurations.html)。  
+ **CodeDeployDefault.ECSAllAtOnce**：将所有流量一次性转移到更新后的 Amazon ECS 容器
+ **CodeDeployDefault.ECSLinear10PercentEvery1Minutes**：在所有流量转移之前，每分钟转移 10％ 的流量。
+ **CodeDeployDefault.ECSLinear10PercentEvery3Minutes**：在所有流量转移之前，每 3 分钟转移 10％ 的流量。
+ **CodeDeployDefault.ECSCanary10Percent5Minutes**：在第一个增量中转移 10% 的流量。其余 90% 在五分钟后进行部署。
+ **CodeDeployDefault.ECSCanary10Percent15Minutes**：在第一个增量中转移 10% 的流量。其余 90% 部署在 15 分钟后进行转移。

**修订**  
修订是 CodeDeploy 应用程序规范文件（AppSpec 文件）。在 AppSpec 文件中，指定任务定义的完整 ARN 以及在创建新部署时要将流量路由到的替换任务集的容器和端口。容器名称必须是任务定义中引用的容器名称之一。如果在服务定义中更新了网络配置或平台版本，则还必须在 AppSpec 文件中指定这些详细信息。您也可以指定要在部署生命周期事件期间运行的 Lambda 函数。Lambda 函数允许您在部署期间运行测试和返回指标。有关更多信息，请参阅 *AWS CodeDeploy 用户指南*中的 [AppSpec 文件参考](https://docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file.html)。

## 注意事项
<a name="deployment-type-bluegreen-considerations"></a>

使用蓝/绿部署类型时，请考虑以下内容：
+ 在初次创建使用蓝/绿部署类型的 Amazon ECS 服务时，将创建一个 Amazon ECS 任务集。
+ 您必须将服务配置为使用应用程序负载均衡器或网络负载均衡器。以下是负载均衡器要求：
  + 您必须将生产侦听器添加到用于路由生产流量的负载均衡器。
  + 可以将可选的测试侦听器添加到负载均衡器，这用于路由测试流量。如果您指定了测试侦听器，则在部署期间 CodeDeploy 会将测试流量路由到替换任务集。
  + 生产和测试侦听器必须属于同一负载均衡器。
  + 您必须为负载均衡器定义一个目标组。目标组通过生产侦听器将流量路由到服务中的原始任务集。
  + 使用网络负载均衡器时，仅支持 `CodeDeployDefault.ECSAllAtOnce` 部署配置。
+ 对于配置为使用服务自动扩缩和蓝绿部署类型的服务，在部署期间不会阻止自动扩缩，但在某些情况下，部署可能会失败。下面将更详细地介绍此行为。
  + 如果服务正在扩展且部署开始，将创建绿色任务集，CodeDeploy 将等待一个小时，让绿色任务集达到稳定状态，在达到稳定状态之前不会转移任何流量。
  + 如果服务处于蓝绿部署过程中，发生了扩展事件，则流量将继续移动 5 分钟。如果服务在 5 分钟内未达到稳定状态，CodeDeploy 将停止部署并将其标记为失败。
+ 使用 Fargate 或 `CODE_DEPLOY` 部署控制器类型的任务不支持 `DAEMON` 调度策略。
+ 当您最初创建 CodeDeploy 应用程序和部署组时，必须指定以下内容：
  + 您必须为负载均衡器定义两个目标组。一个目标组应为在创建 Amazon ECS 服务时为负载均衡器定义的初始目标组。第二个目标组的唯一要求是，它不能与服务所使用的负载均衡器之外的其他负载均衡器相关联。
+ 在为 Amazon ECS 服务创建 CodeDeploy 部署后，CodeDeploy 会在该部署中创建*替换任务集*（或*绿色任务集*）。如果您将测试侦听器添加到了负载均衡器，则 CodeDeploy 会将测试流量路由到替换任务集。此时您可以运行任何验证测试。然后，CodeDeploy 会根据部署组的流量重新路由设置将生产流量从原始任务集重新路由到替换任务集。

## 所需的 IAM 权限
<a name="deployment-type-bluegreen-IAM"></a>

通过将 Amazon ECS 和 CodeDeploy API 组合使用以进行蓝绿部署。用户必须拥有这些服务的相应权限，才能在 AWS 管理控制台 或 AWS CLI 或 SDK 中使用 Amazon ECS 蓝/绿部署。

除了用于创建和更新服务的标准 IAM 权限之外，Amazon ECS 还需要以下权限。这些权限已添加到 `AmazonECS_FullAccess` IAM 策略。有关更多信息，请参阅 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess)。
+ `codedeploy:CreateApplication`
+ `codedeploy:CreateDeployment`
+ `codedeploy:CreateDeploymentGroup`
+ `codedeploy:GetApplication`
+ `codedeploy:GetDeployment`
+ `codedeploy:GetDeploymentGroup`
+ `codedeploy:ListApplications`
+ `codedeploy:ListDeploymentGroups`
+ `codedeploy:ListDeployments`
+ `codedeploy:StopDeployment`
+ `codedeploy:GetDeploymentTarget`
+ `codedeploy:ListDeploymentTargets`
+ `codedeploy:GetDeploymentConfig`
+ `codedeploy:GetApplicationRevision`
+ `codedeploy:RegisterApplicationRevision`
+ `codedeploy:BatchGetApplicationRevisions`
+ `codedeploy:BatchGetDeploymentGroups`
+ `codedeploy:BatchGetDeployments`
+ `codedeploy:BatchGetApplications`
+ `codedeploy:ListApplicationRevisions`
+ `codedeploy:ListDeploymentConfigs`
+ `codedeploy:ContinueDeployment`
+ `sns:ListTopics`
+ `cloudwatch:DescribeAlarms`
+ `lambda:ListFunctions`

**注意**  
除了运行任务和服务所需的标准 Amazon ECS 权限外，用户还需要 `iam:PassRole` 权限，以使用 IAM 角色执行任务。

CodeDeploy 需要调用 Amazon ECS API、修改 Elastic Load Balancing、调用 Lambda 函数和描述 CloudWatch 警报的权限，以及代表您修改服务的预期数量的权限。在创建使用蓝/绿部署类型的 Amazon ECS 服务之前，您必须先创建一个 IAM 角色 (`ecsCodeDeployRole`)。有关更多信息，请参阅 [Amazon ECS CodeDeploy IAM 角色](codedeploy_IAM_role.md)。