

# 创建 Amazon ECS 蓝绿部署
<a name="deploy-blue-green-service"></a>

 通过使用 Amazon ECS 蓝绿部署，您可以进行服务更改并测试，然后再在生产环境中实施服务更改。

## 先决条件
<a name="deploy-blue-green-service-prerequisites"></a>

在开始蓝绿部署之前，执行以下操作。

1. 配置相应的权限。
   + 有关 Elastic Load Balancing 权限的信息，请参阅[适用于负载均衡器的 Amazon ECS 基础设施 IAM 角色](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)。
   + 有关 Lambda 权限的信息，请参阅 [Amazon ECS 蓝绿部署中 Lambda 函数所需的权限](blue-green-permissions.md)

1. （可选）对于托管流量转移，请配置以下资源之一：如果服务是无外设的（没有负载均衡器或 Service Connect），则可以跳过此步骤。Amazon ECS 不会自动管理无外设服务的流量转移。
   + 应用程序负载均衡器：有关更多信息，请参阅[适用于蓝绿部署、线性部署和金丝雀部署的应用程序负载均衡器资源](alb-resources-for-blue-green.md)。
   + 网络负载均衡器：有关更多信息，请参阅[适用于 Amazon ECS 蓝绿部署、线性部署和金丝雀部署的网络负载均衡器资源](nlb-resources-for-blue-green.md)。
   + Service Connect：有关更多信息，请参阅[适用于 Amazon ECS 蓝绿部署、线性部署和金丝雀部署的 Service Connect 资源](service-connect-blue-green.md)。

1. 决定是否要为生命周期阶段运行 Lambda 函数。
   + PRE\_SCALE\_UP
   + POST\_SCALE\_UP
   + TEST\_TRAFFIC\_SHIFT
   + POST\_TEST\_TRAFFIC\_SHIFT
   + PRODUCTION\_TRAFFIC\_SHIFT
   + POST\_PRODUCTION\_TRAFFIC\_SHIFT

   有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[使用控制台创建 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)。

## 过程
<a name="deploy-blue-green-service-procedure"></a>

可使用控制台或 AWS CLI 创建 Amazon ECS 蓝绿服务。

------
#### [ Console ]

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 确定要从其中启动服务的资源。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

   此时会显示**创建服务**页面。

1. 在**服务详细信息**下，执行以下操作：

   1. 对于**任务定义系列**，选择要使用的任务定义。然后，在**任务定义修订**中，输入要使用的修订。

   1. 对于 **Service name**（服务名称），为您的服务输入一个名称。

1. 要在现有集群中运行服务，请为**现有集群**选择集群。要在新集群中运行服务，请选择**创建集群** 

1. 选择任务在集群基础设施中的分发方式。在**计算配置**下，选择您的选项。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

1. 在**部署配置**下，执行以下操作：

   1. 对于**服务类型**，选择**副本**。

   1. 对于 **Desired tasks**（预期任务），输入要在服务中启动并保留的任务数量。

   1. 要让 Amazon ECS 监控可用区之间的任务分配情况，并在出现不平衡时重新分配任务，请在**可用区服务重新平衡**下选择**可用区服务重新平衡**。

   1. 对于**运行状况检查宽限期**，输入在任务首次启动后，服务调度程序将忽略运行状况不佳的 Elastic Load Balancing、VPC Lattice 和容器运行状况检查的时间长度（以秒为单位）。如果没有指定运行状况检查宽限期值，则使用默认值 0。

1. 

   1. 对于**烘焙时间**，输入在蓝色修订服务终止之前蓝色服务修订版和绿色服务修订版同时运行的分钟数。这样可以留出验证和测试时间。

   1. （可选）在部署的特定阶段运行 Lambda 函数。在**部署生命周期挂钩**下，选择要运行生命周期挂钩的阶段。

      要添加生命周期挂钩，请执行以下操作：

      1. 选择**添加**。

      1. 对于 **Lambda 函数**，输入函数名称或 ARN。

      1. 对于**角色**，选择有权调用 Lambda 函数的 IAM 角色。

      1. 对于**生命周期阶段**，选择应运行 Lambda 函数的阶段。

1. 要配置 Amazon ECS 如何检测和处理部署故障，请展开 **Deployment failure detection**（部署故障检测），然后选择您的选项。

   1. 要在任务无法启动时停止部署，请选择 **Use the Amazon ECS deployment circuit breaker**（使用 Amazon ECS 部署断路器）。

      要让软件在部署断路器将部署设置为故障状态时自动将部署回滚到上次完成的部署状态，请选择**故障时回滚**。

   1. 要根据应用程序指标停止部署，请选择**使用 CloudWatch 警报**。然后，从 **CloudWatch 警报名称**中选择警报。要创建新报警，请转到 CloudWatch 控制台。

      要让软件在 CloudWatch 警报将部署设置为故障状态时自动将部署回滚到上次完成的部署状态，请选择**故障时回滚**。

1. （可选）要使用 Service Connect 与服务进行互连，请展开 **Service Connect**，然后指定以下参数：

   1.  选择**打开 Service Connect**。

   1. 在 **Service Connect configuration**（Service Connect 配置）下，指定客户端模式。
      + 如果您的服务运行的网络客户端应用程序只需要连接到命名空间中的其他服务，请选择**仅限客户端**。
      + 如果您的服务运行网络或 Web 服务应用程序且需要为该服务提供端点并连接到命名空间中的其他服务，请选择 **Client and server**（客户端和服务器）。

   1. 要使用默认集群命名空间以外的命名空间，对于**命名空间**，请选择服务命名空间。这可以是您在 AWS 账户的同一 AWS 区域中单独创建的命名空间，也可以是使用 AWS Resource Access Manager（AWS RAM）与您的账户共享的同一区域中的命名空间。有关共享 AWS Cloud Map 命名空间的更多信息，请参阅《AWS Cloud Map 开发人员指南》**中的 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)。

   1. （可选）为蓝绿部署配置测试流量标头规则。在**测试流量路由**下，指定以下内容：

      1. 选择**启用测试流量标头规则**，以便在测试期间将特定请求路由到绿色服务修订版。

      1. 对于**标头匹配规则**，配置路由测试流量的条件：
         + **标头名称**：输入要匹配的 HTTP 标头名称（例如 `X-Test-Version` 或 `User-Agent`）。
         + **匹配类型**：选择匹配条件：
           + **精确匹配**：路由标头值与指定值完全匹配的请求
           + **标头存在性**：路由包含指定标头的请求，无论其值如何
           + **模式匹配**：路由标头值与指定模式匹配的请求
         + **标头值**（如果使用精确匹配或模式匹配）：输入要匹配的值或模式。

         可以添加多个标头匹配规则以创建复杂的路由逻辑。与任何已配置规则相匹配的请求将路由到绿色服务修订版进行测试。

      1. 选择**添加标头规则**以配置其他标头匹配条件。
**注意**  
测试流量标头规则有助于在完成全面部署之前使用受控流量验证新功能。这将允许您使用特定请求（例如来自内部测试工具或测试用户的请求）来测试绿色服务修订版，同时维持流向蓝色服务修订版的正常流量。

   1. （可选）指定日志配置。选择**使用日志收集**。默认选项将容器日志发送到 CloudWatch Logs。其他日志驱动程序选项都使用 AWS FireLens 进行配置。有关更多信息，请参阅 [将 Amazon ECS 日志发送到 AWS 服务或 AWS Partner](using_firelens.md)。

      下面更详细地介绍了每个容器日志目标。
      + **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 存储桶名称。

1. （可选）为蓝绿部署配置 **Load balancing**。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/deploy-blue-green-service.html)

1. （可选）为了帮助确定您的服务和任务，请展开**标签**部分，然后配置您的标签。

   要让 Amazon ECS 使用集群名称和任务定义标签自动标记全部新启动的任务，选择**开启 Amazon ECS 托管标签**，然后对于**从中传播标签**，选择**任务定义**。

   要让 Amazon ECS 使用集群名称和服务标签自动标记全部新启动的任务，选择**开启 Amazon ECS 托管标签**，然后对于**从中传播标签**，选择**服务**。

   添加或删除标签。
   + [添加标签] 选择 **Add tag**（添加标签），然后执行以下操作：
     + 对于 **Key（键）**，输入键名称。
     + 对于**值**，输入键值。
   + [删除标签] 在标签旁，选择**删除标签**。

1. 选择**创建**。

------
#### [ AWS CLI ]

1. 使用以下内容创建名为 `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"
           ],
           "hookDetails": {
             "{{MY_CONFIG_KEY}}": "{{my-config-value}}"
           }
         }
       ]
     },
     "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}}"
         }
       }
     ]
   }
   ```

1. 运行 `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}}}"
   ```

------

## 后续步骤
<a name="deploy-blue-green-service-next-steps"></a>
+ 更新服务以启动部署。有关更多信息，请参阅 [更新 Amazon ECS 服务](update-service-console-v2.md)。
+ 监控部署过程，确保其遵循蓝绿模式：
  + 创建绿色服务修订版并进行纵向扩展
  + 将测试流量路由到绿色修订（如果已配置）
  + 向绿色服务修订转移生产流量
  + 烘焙时间结束后，蓝色修订将终止