通过 CodeDeploy 进行蓝/绿部署 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

通过 CodeDeploy 进行蓝/绿部署

蓝/绿部署类型使用由 CodeDeploy 控制的蓝/绿部署模型。此部署类型让您可以先验证服务的新部署,然后再向其发送生产流量。有关更多信息,请参阅 Amazon CodeDeploy 用户指南中的什么是 CodeDeploy?

在蓝色/绿色部署过程中,有三种可转移流量的方法:

  • Canary — 流量将通过两次递增进行转移。您可以从预定义的 Canary 选项中选择,这些选项指定在第一次增量中转移到更新后的任务集的流量百分比以及以分钟为单位的间隔;然后指定在第二次增量中转移剩余的流量。

  • Linear — 流量使用相等的增量转移,在每次递增之间间隔的分钟数相同。您可以从预定义的线性选项中进行选择,这些选项指定在每次增量中转移的流量百分比以及每次增量之间的分钟数。

  • All-at-once — 所有流量均从原始任务集一次性地转移到更新后的任务集。

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

CodeDeploy 应用程序

CodeDeploy 资源集合。这包括一个或多个部署组。

CodeDeploy 部署组

部署设置。这包括以下内容:

  • Amazon ECS 集群和服务

  • 负载均衡器目标组和侦听器信息

  • 部署回滚策略

  • 流量重新路由设置

  • 原始修订终止设置

  • 部署配置

  • 可设置为停止部署的 CloudWatch 警报配置

  • SNS 或 CloudWatch Events 设置

有关更多信息,请参阅 Amazon CodeDeploy用户手册中的使用部署组

CodeDeploy 部署配置

指定在部署期间 CodeDeploy 如何将生产流量路由到您的替换任务集。提供了以下预定义的线性和 Canary 部署配置。您还可以创建自定义的线性和 Canary 部署。有关详细信息,请参见Amazon CodeDeploy 用户手册中的使用部署配置

部署配置

描述

CodeDeployDefault.ECSLinear10PercentEvery1Minutes

每分钟转移 10% 的流量,直到所有流量转移完毕。

CodeDeployDefault.ECSLinear10PercentEvery3Minutes

每隔 3 分钟转移 10% 的流量,直到所有流量转移完毕。

CodeDeployDefault.ECSCanary10percent5Minutes

在第一次增量中转移 10% 的流量。剩余的 90% 部署在稍后的五分钟内进行转移。

CodeDeployDefault.ECSCanary10percent15Minutes

在第一次增量中转移 10% 的流量。其余 90% 部署在 15 分钟后进行转移。

CodeDeployDefault.ECSAllAtOnce

将所有流量一次性转移到更新后的 Amazon ECS 容器。

修订

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

蓝/绿部署注意事项

使用蓝/绿部署类型时,请考虑以下内容:

  • 在初次创建使用蓝/绿部署类型的 Amazon ECS 服务时,将创建一个 Amazon ECS 任务集。

  • 您必须将服务配置为使用 Application Load Balancer 或 Network Load Balancer。不支持经典负载均衡器。以下是负载均衡器要求:

    • 您必须将生产侦听器添加到用于路由生产流量的负载均衡器。

    • 可以将可选的测试侦听器添加到负载均衡器,这用于路由测试流量。如果您指定了测试侦听器,则在部署期间 CodeDeploy 会将测试流量路由到替换任务集。

    • 生产和测试侦听器必须属于同一负载均衡器。

    • 您必须为负载均衡器定义一个目标组。目标组通过生产侦听器将流量路由到服务中的原始任务集。

    • 使用 Network Load Balancer 时,仅支持 CodeDeployDefault.ECSAllAtOnce 部署配置。

  • 对于配置为使用服务自动缩放和蓝色/绿色部署类型的服务,在部署期间不会阻止自动缩放,但在某些情况下,部署可能会失败。下面将更详细地介绍此行为。

    • 如果服务正在扩展且部署开始,将创建绿色任务集,CodeDeploy 将等待一个小时,让绿色任务集达到稳定状态,在达到稳定状态之前不会转移任何流量。

    • 如果服务处于蓝色/绿色部署过程中,发生了扩展事件,则流量将继续移动 5 分钟。如果服务在 5 分钟内未达到稳定状态,CodeDeploy 将停止部署并将其标记为失败。

    • 如果服务处于蓝/绿部署过程中,并发生了扩缩事件,则所需任务计数可能会设置为意外值。这是因为弹性伸缩将正在运行的任务计数视为当前容量,这是所需任务计数计算中使用的适当任务数的两倍。

  • 使用 Fargate 启动类型或 CODE_DEPLOY 部署控制器类型的任务不支持 DAEMON 调度策略。

  • 当您最初创建 CodeDeploy 应用程序和部署组时,必须指定以下内容:

    • 您必须为负载均衡器定义两个目标组。一个目标组应为在创建 Amazon ECS 服务时为负载均衡器定义的初始目标组。第二个目标组的唯一要求是,它不能与服务所使用的负载均衡器之外的其他负载均衡器相关联。

  • 在为 Amazon ECS 服务创建 CodeDeploy 部署后,CodeDeploy 会在该部署中创建替换任务集(或绿色任务集)。如果您将测试侦听器添加到了负载均衡器,则 CodeDeploy 会将测试流量路由到替换任务集。此时您可以运行任何验证测试。然后,CodeDeploy 会根据部署组的流量重新路由设置将生产流量从原始任务集重新路由到替换任务集。

Amazon ECS 控制台体验

Amazon ECS 控制台中的服务创建和服务更新工作流程支持蓝/绿部署。

要创建使用蓝/绿部署类型的 Amazon ECS 服务,请参阅 创建 Amazon ECS 服务

要更新使用蓝/绿部署类型的现有 Amazon ECS 服务,请参阅 更新服务

在使用 Amazon ECS 控制台创建使用蓝/绿部署类型的Amazon ECS 服务时,将自动使用以下原定设置设置创建 Amazon ECS 任务集和以下 CodeDeploy 资源。

资源

默认设置

应用程序名称

AppECS-<cluster[:47]>-<service[:47]>

部署组名称

DgpECS-<cluster[:47]>-<service[:47]>

部署组负载均衡器信息

将负载均衡器生产侦听器、可选的测试侦听器和指定的目标组添加到部署组配置。

流量重新路由设置

流量重新路由 原定设置为 Reroute traffic immediately (立即重新路由流量)。您可以在 CodeDeploy 控制台上或通过更新 TrafficRoutingConfig 来更改该设置。有关更多信息,请参阅 Amazon CodeDeploy API 参考中的 CreateDeploymentConfig

原始修订终止设置

原始修订终止设置配置为在重新路由流量之后等待 1 小时再终止蓝色任务集。

部署配置

部署配置默认设置为 CodeDeployDefault.ECSAllAtOnce,这会一次性地将所有流量从蓝色任务集路由到绿色任务集。创建服务后,可以使用 Amazon CodeDeploy 控制台更改部署配置。

自动回滚配置

如果部署失败,自动回滚设置配置为将其回滚。

要使用蓝/绿部署类型查看 Amazon ECS 服务的详细信息,请使用 Amazon ECS 上的部署选项卡。

要在 CodeDeploy 控制台中查看 CodeDeploy 部署组的详细信息,请参阅 Amazon CodeDeploy用户指南中的使用 CodeDeploy 查看部署组详细信息

要在 CodeDeploy 控制台中修改 CodeDeploy 部署组的设置,请参阅 Amazon CodeDeploy用户指南中的使用 CodeDeploy 更改部署组设置

为 Amazon CloudFormation 增加了对执行蓝/绿部署的支持。有关更多信息,请参阅 Amazon CloudFormation 用户指南中的使用 Amazon CloudFormation 通过 CodeDeploy 进行Amazon ECS 蓝/绿部署

蓝/绿部署所需的 IAM 权限

通过将 Amazon ECS 和 CodeDeploy API 组合使用以提供 Amazon ECS 蓝/绿部署接口进行部署。IAM 用户必须拥有这些服务的相应权限,才能在 Amazon Web Services Management Console 或 Amazon CLI 或 SDK 中使用 Amazon ECS 蓝/绿部署。

除了用于创建和更新服务的标准 IAM 权限之外,Amazon ECS 还需要以下权限。这些权限已添加到 AmazonECS_FullAccess IAM policy。有关更多信息,请参阅AmazonECS_FullAccess

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "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" ], "Resource": [ "*" ] } ] }
注意

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

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

创建服务示例更新服务示例 IAM policy 示例说明 IAM 用户在 Amazon Web Services Management Console 上使用 Amazon ECS 蓝/绿部署所需的权限。