

# 适用于蓝绿部署、线性部署和金丝雀部署的应用程序负载均衡器资源
<a name="alb-resources-for-blue-green"></a>

要将应用程序负载均衡器用于 Amazon ECS 蓝绿部署，需要配置特定的资源，以便在蓝色服务修订版与绿色服务修订版之间进行流量路由。

## 目标组
<a name="alb-target-groups"></a>

对于使用 Elastic Load Balancing 的蓝绿部署，需要创建两个目标组：
+ 一个用于蓝色服务修订版（当前生产流量）的主目标组
+ 一个用于绿色服务修订版（新版本）的备用目标组

两个目标组都应配置以下设置：
+ 目标类型：`IP`（适用于 Fargate 或采用 `awsvpc` 网络模式的 EC2）
+ 协议：`HTTP`（或应用程序使用的协议）
+ 端口：应用程序侦听端口（HTTP 通常为 `80`）
+ VPC：与 Amazon ECS 任务相同的 VPC
+ 运行状况检查设置：配置为正确检查应用程序的运行状况

在蓝绿部署期间，Amazon ECS 会根据部署阶段自动将任务注册到相应的目标组。

**Example 为应用程序负载均衡器创建目标组**  
以下 CLI 命令将创建两个目标组，用于使用应用程序负载均衡器的蓝绿部署：  

```
aws elbv2 create-target-group \
    --name blue-target-group \
    --protocol HTTP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-path / \
    --health-check-protocol HTTP \
    --health-check-interval-seconds 30 \
    --health-check-timeout-seconds 5 \
    --healthy-threshold-count 2 \
    --unhealthy-threshold-count 2

aws elbv2 create-target-group \
    --name green-target-group \
    --protocol HTTP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-path / \
    --health-check-protocol HTTP \
    --health-check-interval-seconds 30 \
    --health-check-timeout-seconds 5 \
    --healthy-threshold-count 2 \
    --unhealthy-threshold-count 2
```

## 应用程序负载均衡器
<a name="alb-load-balancer"></a>

需要创建具有以下配置的应用程序负载均衡器：
+ 方案：面向互联网或内部（视需求而定）
+ IP 地址类型：IPv4
+ VPC：与 Amazon ECS 任务相同的 VPC
+ 子网：至少两个位于不同可用区的子网
+ 安全组：允许通过侦听器端口的流量的安全组

附加到应用程序负载均衡器的安全组必须具有出站规则，允许流量传入附加到 Amazon ECS 任务的安全组。

**Example 创建应用程序负载均衡器**  
以下 CLI 命令将创建用于蓝绿部署的应用程序负载均衡器：  

```
aws elbv2 create-load-balancer \
    --name my-application-load-balancer \
    --type application \
    --security-groups sg-abcd1234 \
    --subnets subnet-12345678 subnet-87654321
```

## 侦听器和规则
<a name="alb-listeners"></a>

对于蓝绿部署，需要在应用程序负载均衡器上配置以下侦听器：
+ 生产侦听器：处理生产流量（通常在端口 80 或 443 上）
  + 一开始，先将流量转发到主目标组（蓝色服务修订版）
  + 部署后，将流量转发到备用目标组（绿色服务修订版）
+ 测试侦听器（可选）：处理测试流量，以便在转移生产流量之前验证绿色服务修订版
  + 可以在不同的端口（例如 8080 或 8443）上进行配置
  + 在测试期间将流量转发到备用目标组（绿色服务修订版）

在蓝绿部署期间，Amazon ECS 会自动更新侦听器规则，以便根据部署阶段将流量路由到相应的目标组。

**Example 创建生产侦听器**  
以下 CLI 命令将在端口 80 上创建生产侦听器，将流量转发到主（蓝色）目标组：  

```
aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/app/my-application-load-balancer/abcdef123456 \
    --protocol HTTP \
    --port 80 \
    --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/blue-target-group/abcdef123456
```

**Example 创建测试侦听器**  
以下 CLI 命令将在端口 8080 上创建测试侦听器，将流量转发到备用（绿色）目标组：  

```
aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/app/my-application-load-balancer/abcdef123456 \
    --protocol HTTP \
    --port 8080 \
    --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/ghijkl789012
```

**Example 创建基于路径路由的侦听器规则**  
以下 CLI 命令将创建一条规则，将特定路径的流量转发到绿色目标组进行测试：  

```
aws elbv2 create-rule \
    --listener-arn arn:aws:elasticloadbalancing:region:123456789012:listener/app/my-application-load-balancer/abcdef123456/ghijkl789012 \
    --priority 10 \
    --conditions Field=path-pattern,Values='/test/*' \
    --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/ghijkl789012
```

**Example 创建基于标头路由的侦听器规则**  
以下 CLI 命令将创建一条规则，将带有特定标头的流量转发到绿色目标组进行测试：  

```
aws elbv2 create-rule \
    --listener-arn arn:aws:elasticloadbalancing:region:123456789012:listener/app/my-application-load-balancer/abcdef123456/ghijkl789012 \
    --priority 20 \
    --conditions Field=http-header,HttpHeaderConfig='{Name=X-Environment,Values=[test]}' \
    --actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/ghijkl789012
```

## 服务配置
<a name="alb-service-configuration"></a>

必须拥有允许 Amazon ECS 代表您管理集群中负载均衡器资源的权限。有关更多信息，请参阅 [适用于负载均衡器的 Amazon ECS 基础设施 IAM 角色](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)。

在为使用 Elastic Load Balancing 的蓝绿部署创建或更新 Amazon ECS 服务时，需要指定以下配置。

将 *user-input* 替换为您的值。

此配置中的关键组件包括：
+ `targetGroupArn`：主目标组（蓝色服务修订版）的 ARN。
+ `alternateTargetGroupArn`：备用目标组（绿色服务修订版）的 ARN。
+ `productionListenerRule`：适用于生产流量的侦听器规则的 ARN。
+ `roleArn`：允许 Amazon ECS 管理 Elastic Load Balancing 资源的角色的 ARN。
+ `strategy`：设置为 `BLUE_GREEN` 以启用蓝绿部署。
+ `bakeTimeInMinutes`：生产流量转移后，蓝色服务修订版和绿色服务修订版同时运行的持续时间。
+ `TestListenerRule`：适用于测试流量的侦听器规则的 ARN。此参数为可选参数。

```
{
    "loadBalancers": [
        {
            "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/primary-target-group/abcdef123456",
            "containerName": "container-name",
            "containerPort": 80,
            "advancedConfiguration": {
                "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:region:account-id:targetgroup/alternate-target-group/ghijkl789012",
                "productionListenerRule": "arn:aws:elasticloadbalancing:region:account-id:listener-rule/app/load-balancer-name/abcdef123456/listener/ghijkl789012/rule/mnopqr345678",
                "roleArn": "arn:aws:iam::123456789012:role/ecs-elb-role"
            }
        }
    ],
    "deploymentConfiguration": {
        "strategy": "BLUE_GREEN",
        "maximumPercent": 200,
        "minimumHealthyPercent": 100,
        "bakeTimeInMinutes": 5
    }
}
```

## 部署期间的流量流
<a name="alb-traffic-flow"></a>

在使用 Elastic Load Balancing 进行蓝绿部署期间，流量按如下方式在系统中传输：

1. *初始状态*：所有生产流量均路由到主目标组（蓝色服务修订版）。

1. *绿色服务修订版部署*：Amazon ECS 部署新任务并将其注册到备用目标组。

1. *测试流量*：如果配置了测试侦听器，则会将测试流量路由到备用目标组以验证绿色服务修订版。

1. *生产流量转移*：Amazon ECS 更新生产侦听器规则，将流量路由到备用目标组（绿色服务修订版）。

1. *烘焙时间*：生产流量转移后，蓝色服务修订版和绿色服务修订版同时运行的持续时间。

1. *完成*：成功部署后，蓝色服务修订版将终止。

如果在部署期间检测到问题，Amazon ECS 可以通过将流量路由回主目标组（蓝色服务修订版）实现自动回滚。