创建 Amazon ECS 蓝绿部署
通过使用 Amazon ECS 蓝绿部署,您可以进行服务更改并测试,然后再在生产环境中实施服务更改。
先决条件
在开始蓝绿部署之前,执行以下操作。
-
配置相应的权限。
-
有关 Elastic Load Balancing 权限的信息,请参阅适用于负载均衡器的 Amazon ECS 基础设施 IAM 角色。
-
有关 Lambda 权限的信息,请参阅 Amazon ECS 蓝绿部署中 Lambda 函数所需的权限
-
-
Amazon ECS 蓝绿部署要求服务使用以下功能之一:配置相应的资源。
-
应用程序负载均衡器:有关更多信息,请参阅适用于蓝绿部署的应用程序负载均衡器资源。
-
网络负载均衡器:有关更多信息,请参阅适用于 Amazon ECS 蓝绿部署的网络负载均衡器资源。
-
Service Connect:有关更多信息,请参阅适用于 Amazon ECS 蓝绿部署的 Service Connect 资源。
-
-
创建规则,以将流量路由到绿色服务修订。有关更多信息,请参阅《Network Load Balancer User Guide》中的 Listener rules。
-
为绿色服务修订创建目标组。使用
awsvpc
网络模式执行任务时,目标类型必须是ip
。有关更多信息,请参阅《Network Load Balancer User Guide》中的 Target groups。 -
决定是否要为生命周期事件运行 Lambda 函数。
-
纵向扩展前
-
纵向扩展后
-
测试流量转移
-
测试流量转移后
-
生产流量转移
-
生产流量转移后
为每个生命周期事件创建 Lambda 函数。有关更多信息,请参阅《AWS Lambda 开发人员指南》中的使用控制台创建 Lambda 函数。
-
过程
可使用控制台或 AWS CLI 创建 Amazon ECS 蓝绿服务。
- Console
-
-
确定要从其中启动服务的资源。
从中启动服务 步数 集群
-
在集群页面上,选择要在其中创建服务的集群。
此时将显示集群详细信息页面。
-
在 Services (服务) 选项卡上,选择 Create (创建)。
任务定义 -
在任务定义页面上,选择任务定义。
-
从部署菜单中,选择创建服务。
此时会显示创建服务页面。
-
-
在服务详细信息下,执行以下操作:
-
对于任务定义系列,选择要使用的任务定义。然后,在任务定义修订中,输入要使用的修订。
-
对于 Service name(服务名称),为您的服务输入一个名称。
-
-
要在现有集群中运行服务,请为现有集群选择集群。要在新集群中运行服务,请选择创建集群
-
选择任务在集群基础设施中的分发方式。在计算配置下,选择您的选项。
计算选项 步数 容量提供程序策略
-
在计算选项下,选择容量提供程序策略。
-
选择策略:
-
要使用集群的原定设置容量提供程序策略,请选择 Use cluster default(使用集群原定设置)。
-
如果集群没有默认的容量提供程序策略,或者要使用自定义策略,请选择使用自定义,添加容量提供程序策略,然后通过指定基准、容量提供程序和权重来定义自定义容量提供程序策略。
-
注意
要在策略中使用容量提供程序,容量提供程序必须与集群相关联。
启动类型 -
在 Compute options(计算选项)部分中,选择 Launch type(启动类型)。
-
对于 Launch type(启动类型),请选择一种启动类型。
-
(可选)当指定 Fargate 启动类型时,对于平台版本中,指定要使用的平台版本。如果未指定任何版本,将使用
LATEST
平台版本。
-
-
在部署配置下,执行以下操作:
-
对于服务类型,选择副本。
-
对于 Desired tasks(预期任务),输入要在服务中启动并保留的任务数量。
-
要让 Amazon ECS 监控可用区之间的任务分配情况,并在出现不平衡时重新分配任务,请在可用区服务重新平衡下选择可用区服务重新平衡。
-
对于运行状况检查宽限期,输入在任务首次启动后,服务调度程序将忽略运行状况不佳的 Elastic Load Balancing、VPC Lattice 和容器运行状况检查的时间长度(以秒为单位)。如果没有指定运行状况检查宽限期值,则使用默认值 0。
-
-
-
对于烘焙时间,输入在蓝色修订服务终止之前蓝色服务修订和绿色服务修订同时运行的分钟数。这样可以留出验证和测试时间。
-
(可选)在部署的特定阶段运行 Lambda 函数。在部署生命周期挂钩下,选择要运行生命周期挂钩的阶段。
要添加生命周期挂钩,请执行以下操作:
-
选择添加。
-
对于 Lambda 函数,输入函数名称或 ARN。
-
对于角色,选择有权调用 Lambda 函数的 IAM 角色。
-
对于生命周期阶段,选择应运行 Lambda 函数的阶段。
-
-
-
要配置 Amazon ECS 如何检测和处理部署故障,请展开 Deployment failure detection(部署故障检测),然后选择您的选项。
-
要在任务无法启动时停止部署,请选择 Use the Amazon ECS deployment circuit breaker(使用 Amazon ECS 部署断路器)。
要让软件在部署断路器将部署设置为故障状态时自动将部署回滚到上次完成的部署状态,请选择故障时回滚。
-
要根据应用程序指标停止部署,请选择使用 CloudWatch 警报。然后,从 CloudWatch 警报名称中选择警报。要创建新报警,请转到 CloudWatch 控制台。
要让软件在 CloudWatch 警报将部署设置为故障状态时自动将部署回滚到上次完成的部署状态,请选择故障时回滚。
-
-
(可选)要使用 Service Connect 与服务进行互连,请展开 Service Connect,然后指定以下参数:
-
选择打开 Service Connect。
-
在 Service Connect configuration(Service Connect 配置)下,指定客户端模式。
-
如果您的服务运行的网络客户端应用程序只需要连接到命名空间中的其他服务,请选择仅限客户端。
-
如果您的服务运行网络或 Web 服务应用程序且需要为该服务提供端点并连接到命名空间中的其他服务,请选择 Client and server(客户端和服务器)。
-
-
要使用默认集群命名空间以外的命名空间,对于 Namespace(命名空间),请选择服务命名空间。
-
(可选)为蓝绿部署配置测试流量标头规则。在测试流量路由下,指定以下内容:
-
选择启用测试流量标头规则,以便在测试期间将特定请求路由到绿色服务修订。
-
对于标头匹配规则,配置路由测试流量的条件:
-
标头名称:输入要匹配的 HTTP 标头名称(例如
X-Test-Version
或User-Agent
)。 -
匹配类型:选择匹配条件:
-
精确匹配:路由标头值与指定值完全匹配的请求
-
标头存在性:路由包含指定标头的请求,无论其值如何
-
模式匹配:路由标头值与指定模式匹配的请求
-
-
标头值(如果使用精确匹配或模式匹配):输入要匹配的值或模式。
可以添加多个标头匹配规则以创建复杂的路由逻辑。与任何已配置规则相匹配的请求将路由到绿色服务修订进行测试。
-
-
选择添加标头规则以配置其他标头匹配条件。
注意
测试流量标头规则有助于在完成全面部署之前使用受控流量验证新功能。这将允许您使用特定请求(例如来自内部测试工具或测试用户的请求)来测试绿色服务修订,同时维持流向蓝色服务修订的正常流量。
-
-
(可选)指定日志配置。选择使用日志收集。默认选项将容器日志发送到 CloudWatch Logs。其他日志驱动程序选项都使用 AWS FireLens 进行配置。有关更多信息,请参阅 将 Amazon ECS 日志发送到 AWS 服务或 AWS Partner。
下面更详细地介绍了每个容器日志目标。
-
Amazon CloudWatch – 将任务配置为将容器日志发送到 CloudWatch Logs。提供了默认的日志驱动程序选项,用于代表您创建 CloudWatch 日志组。要指定其他日志组名称,请更改驱动程序选项值。
-
Amazon Data Firehose – 将任务配置为将容器日志发送到 Firehose。提供了默认的日志驱动程序选项,这些选项将日志发送到 Firehose 传输流。要指定其他传输流名称,请更改驱动程序选项值。
-
Amazon Kinesis Data Streams – 将任务配置为将容器日志发送到 Kinesis Data Streams。提供了默认的日志驱动程序选项,这些选项将日志发送到 Kinesis Data Streams 流。要指定其他传输流名称,请更改驱动程序选项值。
-
Amazon OpenSearch Service – 将任务配置为将容器日志发送到 OpenSearch Service 域。必须提供日志驱动程序选项。
-
Amazon S3 – 将任务配置为将容器日志发送到 Amazon S3 存储桶。提供了默认的日志驱动程序选项,但您必须指定有效的 Amazon S3 存储桶名称。
-
-
-
(可选)为蓝绿部署配置 Load balancing。
Elastic Load Balancing 类型 步数 应用程序负载均衡器
-
对于负载均衡器类型,选择应用程序负载均衡器。
-
选择创建新负载均衡器来创建新的 Application Load Balancer,或使用现有负载均衡器选择现有 Application Load Balancer。
-
对于容器,选择用于托管服务的容器。
-
对于 Load balancer name(负载均衡器名称),输入唯一的名称。
-
对于 Listener(侦听器),为应用程序负载均衡器输入一个端口和协议,以侦听连接请求。预设情况下,负载均衡器将配置为使用端口 80 和 HTTP。
-
对于生产规则,输入规则的评估顺序和路径模式。
此规则适用于生产(蓝色)服务修订流量。
-
对于测试规则,输入规则的评估顺序和路径模式。
此规则适用于测试(绿色)服务修订流量。
-
-
对于目标组,配置以下内容:
-
对于 Target group name(目标组名称),输入应用程序负载均衡器要将请求路由到的目标组的名称和协议。
-
对于协议,选择应用程序负载均衡器要向其路由请求的目标组的协议。默认情况下,目标组会将请求路由到任务定义中定义的第一个容器。
-
对于注销延迟,请输入负载均衡器将目标状态更改为
UNUSED
的秒数。默认值为 300 秒。 -
对于 Health check path(运行状况检查路径),输入容器中存在的路径,应用程序负载均衡器应定期发送请求以验证应用程序负载均衡器和容器之间的连接运行状况。默认路径为根目录(
/
)。 -
对于备用组名称,输入测试(绿色)服务修订目标组的组名称。
-
网络负载均衡器 -
对于 Load balancer type(负载均衡器类型),选择网络负载均衡器。
-
对于 Load Balancer(负载均衡器),选择一个现有的网络负载均衡器。
-
对于 Choose container to load balance(选择用于负载均衡的容器),选择托管服务的容器。
-
对于生产侦听器,选择生产侦听器端口和生产侦听器协议。
此侦听器适用于生产(蓝色)服务修订流量。
-
对于测试侦听器,选择测试侦听器端口和测试侦听器协议。
此侦听器适用于测试(绿色)服务修订流量。
-
对于目标组,配置以下内容:
-
对于 Target group name(目标组名称),输入网络负载均衡器要将请求路由到的目标组的名称和协议。
-
对于协议,选择网络负载均衡器要向其路由请求的目标组的协议。默认情况下,目标组会将请求路由到任务定义中定义的第一个容器。
-
对于注销延迟,请输入负载均衡器将目标状态更改为
UNUSED
的秒数。默认值为 300 秒。 -
对于 Health check path(运行状况检查路径),输入容器中存在的路径,应用程序负载均衡器应定期发送请求以验证应用程序负载均衡器和容器之间的连接运行状况。默认路径为根目录(
/
)。 -
对于备用组名称,输入测试(绿色)服务修订目标组的组名称。
-
-
-
(可选)为了帮助确定您的服务和任务,请展开 Tags(标签)部分,然后配置您的标签。
要让 Amazon ECS 使用集群名称和任务定义标签自动标记全部新启动的任务,选择开启 Amazon ECS 托管标签,然后对于从中传播标签,选择任务定义。
要让 Amazon ECS 使用集群名称和服务标签自动标记全部新启动的任务,选择开启 Amazon ECS 托管标签,然后对于从中传播标签,选择服务。
添加或删除标签。
-
[添加标签] 选择 Add tag(添加标签),然后执行以下操作:
-
对于 Key(键),输入键名称。
-
对于值,输入键值。
-
-
[删除标签] 在标签旁,选择 Remove tag (删除标签)。
-
-
选择创建。
- AWS CLI
-
-
使用以下内容创建名为
service-definition.json
的文件。将
user-input
替换为您的值。{ "serviceName": "
myBlueGreenService
", "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster
", "taskDefinition": "sample-fargate:1
", "desiredCount": 5, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-09ce6e74c116a2299
", "subnet-00bb3bd7a73526788
", "subnet-0048a611aaec65477
" ], "securityGroups": [ "sg-09d45005497daa123
" ], "assignPublicIp": "ENABLED" } }, "deploymentController": { "type": "ECS" }, "deploymentConfiguration": { "strategy": "BLUE_GREEN", "maximumPercent": 200, "minimumHealthyPercent": 100, "bakeTimeInMinutes": 2, "alarms": { "alarmNames": [ "myAlarm" ], "rollback": true, "enable": true }, "lifecycleHooks": [ { "hookTargetArn": "arn:aws:lambda:us-west-2:7123456789012:function:checkExample
", "roleArn": "arn:aws:iam::123456789012:role/ECSLifecycleHookInvoke
", "lifecycleStages": [ "PRE_SCALE_UP" ] } ] }, "loadBalancers": [ { "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197
", "containerName": "fargate-app
", "containerPort": 80, "advancedConfiguration": { "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199
", "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-blue-green-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911
", "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS
" } } ] } -
运行
create-service
。将
user-input
替换为您的值。aws ecs create-service --cli-input-json file://service-definition.json
或者,也可以使用以下示例,该示例使用负载均衡器配置创建蓝绿部署服务:
aws ecs create-service \ --cluster "
arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster
" \ --service-name "blue-green-example-service" \ --task-definition "nginxServer:1" \ --launch-type "FARGATE" \ --network-configuration "awsvpcConfiguration={subnets=[subnet-12345
,subnet-67890
,subnet-abcdef
,subnet-fedcba
],securityGroups=[sg-12345
],assignPublicIp=ENABLED}" \ --desired-count 3 \ --deployment-controller "type=ECS" \ --deployment-configuration "strategy=BLUE_GREEN,maximumPercent=200,minimumHealthyPercent=100,bakeTimeInMinutes=0" \ --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/MyBGtg1/abcdef1234567890
,containerName=nginx,containerPort=80,advancedConfiguration={alternateTargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:123456789012
:targetgroup/MyBGtg2/0987654321fedcba
,productionListenerRule=arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/MyLB/1234567890abcdef/1234567890abcdef
,roleArn=arn:aws:iam::123456789012:role/ELBManagementRole
}"
-
后续步骤
更新服务以启动部署。有关更多信息,请参阅 更新 Amazon ECS 服务。
-
监控部署过程,确保其遵循蓝绿模式:
-
创建绿色服务修订并进行纵向扩展
-
将测试流量路由到绿色修订(如果已配置)
-
向绿色服务修订转移生产流量
-
烘焙时间结束后,蓝色修订将终止
-