

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 藍/綠、線性和金絲雀部署的 Application Load Balancer 資源
<a name="alb-resources-for-blue-green"></a>

若要搭配 Amazon ECS 藍/綠部署使用 Application Load Balancer，需要設定特定資源，以允許藍色與綠色服務修訂版之間的流量路由。

## 目標群組
<a name="alb-target-groups"></a>

若要搭配 Elastic Load Balancing 使用藍/綠部署，需要建立兩個目標群組：
+ 用於藍色服務修訂版的主要目標群組 (目前生產流量)
+ 用於綠色服務修訂版的替代目標群組 (新版本)

兩個目標群組都應使用下列設定進行設定：
+ 目標類型：`IP` (適用於 Fargate 或使用 `awsvpc` 網路模式的 EC2)
+ 通訊協定：`HTTP` (或應用程式使用的通訊協定)
+ 連接埠：應用程式監聽的連接埠 (對於 HTTP 通常為 `80`)
+ VPC：與 Amazon ECS 任務相同的 VPC
+ 運作狀態檢查設定：設定為正確檢查應用程式的運作狀態

在藍/綠部署期間，Amazon ECS 會根據部署階段，自動向相應的目標群組註冊任務。

**Example 為 Application Load Balancer 建立目標群組**  
下列 CLI 命令會建立兩個目標群組，用於藍/綠部署中的 Application Load Balancer：  

```
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
```

## Application Load Balancer
<a name="alb-load-balancer"></a>

您需要建立包含下列組態的 Application Load Balancer：
+ 結構描述：面向網際網路或內部，視要求而定
+ IP 位址類型：IPv4
+ VPC：與 Amazon ECS 任務相同的 VPC
+ 子網路：至少兩個位於不同可用區域的子網路
+ 安全群組：允許接聽程式連接埠流量的安全群組

連接至 Application Load Balancer 的安全群組必須具有傳出規則，允許流量傳送至連接至 Amazon ECS 任務的安全群組。

**Example 建立 Application Load Balancer**  
下列 CLI 命令會建立用於藍綠部署的 Application Load Balancer：  

```
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>

對於藍/綠部署，您需要在 Application Load Balancer 上設定接聽程式：
+ 生產接聽程式：處理生產流量 (通常位於連接埠 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 可以透過將流量路由回主要目標群組 (藍色服務修訂版) 實現自動復原。