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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

蓝/绿部署 CodeDeploy

蓝/绿部署类型使用由控制的蓝/绿部署模型。 CodeDeploy在向服务发送生产流量之前,请使用此部署类型验证服务的新部署。有关更多信息,请参阅《Amazon CodeDeploy 用户指南》 CodeDeploy中的内容

在蓝/绿部署期间,流量可以通过三种方式移动:

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

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

  • A ll-at-once-所有流量都从原始任务集同时转移到更新的任务集。

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

CodeDeploy 应用程序

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

CodeDeploy 部署组

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

  • Amazon ECS 集群和服务

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

  • 部署回滚策略

  • 流量重新路由设置

  • 原始修订终止设置

  • 部署配置

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

  • 通知的 SNS 或 CloudWatch 事件设置

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

CodeDeploy 部署配置

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

  • CodeDeployDefault.ECS AllAtOnce:一次性将所有流量转移到更新后的 Amazon ECS 容器

  • CodeDeployDefault.ecsLinear10 PercentEvery 1Minutes:在所有流量转移之前,每分钟移动 10% 的流量。

  • CodeDeployDefault.ecsLinear10 PercentEvery 3Minutes:每 3 分钟移动 10% 的流量,直到所有流量都转移完毕。

  • CodeDeployDefault.ecscanary10perct5minutes:在第一个增量中移动 10% 的流量。其余 90% 部署在五分钟后进行转移。

  • CodeDeployDefault.ecscanary10perct15minutes:在第一个增量中移动 10% 的流量。其余 90% 部署在 15 分钟后进行转移。

修订

修订版是 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 会根据部署组的流量重新路由设置将生产流量从原始任务集重新路由到替换任务集。

蓝/绿部署所需的 IAM 权限

Amazon ECS 的蓝/绿部署是通过将 Amazon ECS 和 CodeDeploy API 结合起来实现的。用户必须拥有使用这些服务的相应权限,然后才能在 Amazon Web Services Management Console 或软件开发工具包中使用 Amazon ECS 蓝/绿部署。 Amazon CLI

除了用于创建和更新服务的标准 IAM 权限之外,Amazon ECS 还需要以下权限。这些权限已添加到 AmazonECS_FullAccess IAM policy。有关更多信息,请参阅 亚马逊 ECS_ 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:PassRole 权限,以使用 IAM 角色执行任务。

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

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