

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

# Amazon ECS 藍/綠、線性和 Canary 部署的 Network Load Balancer 資源
<a name="nlb-resources-for-blue-green"></a>

若要搭配 Amazon ECS 藍/綠部署使用 Network Load Balancer，需要設定特定資源，以啟用藍色與綠色服務修訂版之間的流量路由。本節說明必要的元件及其組態。

如果組態包含 Network Load Balancer，Amazon ECS 會向下列生命週期階段新增 10 分鐘延遲：
+ TEST\$1TRAFFIC\$1SHIFT
+ PRODUCTION\$1TRAFFIC\$1SHIFT

此延遲旨在應對 Network Load Balancer 的計時問題，這些問題可能導致設定的流量權重與資料平面中的實際流量路由不相符。

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

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

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

  對於 TCP 運作狀態檢查，Network Load Balancer 會與目標建立 TCP 連線。如果連線成功，則目標會視為運作狀態良好。

  對於 HTTP/HTTPS 運作狀態檢查，Network Load Balancer 會將 HTTP/HTTPS 請求傳送至目標，並驗證回應。

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

**Example 為 Network Load Balancer 建立目標群組**  
下列 AWS CLI 命令會建立兩個目標群組，以便在藍/綠部署中與 Network Load Balancer 搭配使用：  

```
aws elbv2 create-target-group \
    --name blue-target-group \
    --protocol TCP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-protocol TCP

aws elbv2 create-target-group \
    --name green-target-group \
    --protocol TCP \
    --port 80 \
    --vpc-id vpc-abcd1234 \
    --target-type ip \
    --health-check-protocol TCP
```

## Network Load Balancer
<a name="nlb-load-balancer"></a>

您需要建立包含下列組態的 Network Load Balancer：
+ 結構描述：面向網際網路或內部，視要求而定
+ IP 位址類型：IPv4
+ VPC：與 Amazon ECS 任務相同的 VPC
+ 子網路：至少兩個位於不同可用區域的子網路

與 Application Load Balancer 不同，Network Load Balancer 會在傳輸層 (第 4 層) 運作，並且不會使用安全群組。反之，您需要確保與 Amazon ECS 任務相關聯的安全群組允許來自接聽程式連接埠上 Network Load Balancer 的流量。

**Example 建立 Network Load Balancer**  
下列 AWS CLI 命令會建立 Network Load Balancer 以用於藍/綠部署：  

```
aws elbv2 create-load-balancer \
    --name my-network-load-balancer \
    --type network \
    --subnets subnet-12345678 subnet-87654321
```

## 搭配藍/綠部署使用 NLB 的考量
<a name="nlb-considerations"></a>

搭配藍/綠部署使用 Network Load Balancer 時，請考量下列事項：
+ **第 4 層運作**：Network Load Balancer 會在傳輸層 (第 4 層) 運作，且不會檢查應用程式層 (第 7 層) 的內容。這表示您無法使用 HTTP 標頭或路徑作出路由決策。
+ **運作狀態檢查**：Network Load Balancer 運作狀態檢查僅限於 TCP、HTTP 或 HTTPS 通訊協定。對於 TCP 運作狀態檢查，Network Load Balancer 僅會驗證是否可以建立連線。
+ **連線保留**：Network Load Balancer 會保留用戶端的來源 IP 位址，這對於安全與記錄用途非常有用。
+ **靜態 IP 位址**：Network Load Balancer 會為每個子網路提供靜態 IP 位址，這在需要列入允許清單或用戶端需要連線至固定 IP 位址時非常有用。
+ **測試流量**：由於 Network Load Balancer 不支援以內容為基礎的路由，測試流量必須傳送至與生產流量不同的連接埠。

## 接聽程式和規則
<a name="nlb-listeners"></a>

對於搭配 Network Load Balancer 使用的藍/綠部署，您需要設定接聽程式：
+ 生產接聽程式：處理生產流量 (通常位於連接埠 80 或 443)
  + 最初將流量轉送至主要目標群組 (藍色服務修訂版)
  + 部署之後，將流量轉送至替代目標群組 (綠色服務修訂版)
+ 測試接聽程式 (選用)：處理測試流量，以在轉移生產流量之前驗證綠色服務修訂版
  + 可以在不同的連接埠上設定 (例如 8080 或 8443)
  + 在測試期間將流量轉送至替代目標群組 (綠色服務修訂版)

與 Application Load Balancer 不同，Network Load Balancer 不支援以內容為基礎的路由規則。反之，流量會根據接聽程式連接埠與通訊協定進行路由。

下列 AWS CLI 命令會建立 Network Load Balancer 的生產和測試接聽程式：

將 *user-input* 取代為實際值。

```
aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/net/my-network-lb/1234567890123456 \
    --protocol TCP \
    --port 80 \
    --default-actions Type=forward, TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/blue-target-group/1234567890123456

aws elbv2 create-listener \
    --load-balancer-arn arn:aws:elasticloadbalancing:region:123456789012:loadbalancer/net/my-network-lb/1234567890123456 \
    --protocol TCP \
    --port 8080 \
    --default-actions Type=forward, TargetGroupArn=arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/1234567890123456
```

## 服務組態
<a name="nlb-service-configuration"></a>

您必須擁有許可，才能允許 Amazon ECS 代表您管理叢集中的負載平衡器資源。如需詳細資訊，請參閱[負載平衡器的 Amazon ECS 基礎結構 IAM 角色](AmazonECSInfrastructureRolePolicyForLoadBalancers.md)。

為搭配 Network Load Balancer 使用的藍/綠部署建立或更新 Amazon ECS 服務時，需要指定下列組態：

將 *user-input* 取代為實際值。

此組態中的關鍵元件包括：
+ `targetGroupArn`：主要目標群組的 ARN (藍色服務修訂版)
+ `alternateTargetGroupArn`：替代目標群組的 ARN (綠色服務修訂版)
+ `productionListenerRule`：用於生產流量的接聽程式 ARN
+ `testListenerRule`：(選用) 用於測試流量的接聽程式 ARN
+ `roleArn`：允許 Amazon ECS 管理 Network Load Balancer 資源的角色 ARN
+ `strategy`：設定為 `BLUE_GREEN` 以啟用藍/綠部署
+ `bakeTimeInMinutes`：生產流量轉移後，藍色和綠色服務修訂同時執行的持續時間

```
{
    "loadBalancers": [
        {
            "targetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/blue-target-group/1234567890123456",
            "containerName": "container-name",
            "containerPort": 80,
            "advancedConfiguration": {
                "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:region:123456789012:targetgroup/green-target-group/1234567890123456",
                "productionListenerRule": "arn:aws:elasticloadbalancing:region:123456789012:listener/net/my-network-lb/1234567890123456/1234567890123456",
                "testListenerRule": "arn:aws:elasticloadbalancing:region:123456789012:listener/net/my-network-lb/1234567890123456/2345678901234567",
                "roleArn": "arn:aws:iam::123456789012:role/ecs-nlb-role"
            }
        }
    ],
    "deploymentConfiguration": {
        "strategy": "BLUE_GREEN",
        "maximumPercent": 200,
        "minimumHealthyPercent": 100,
        "bakeTimeInMinutes": 5
    }
}
```

## 部署期間的流量流程
<a name="nlb-traffic-flow"></a>

在搭配 Network Load Balancer 使用藍/綠部署期間，流量會流經系統，如下所示：

1. *初始狀態*：所有生產流量都會路由至主要目標群組 (藍色服務修訂版)。

1. *綠色服務修訂版部署*：Amazon ECS 會部署新任務，並向替代目標群組註冊新任務。

1. *測試流量*：如果已設定測試接聽程式，則測試流量會路由至替代目標群組，以驗證綠色服務修訂版。

1. *生產流量轉移*：Amazon ECS 會更新生產接聽程式，將流量路由至替代目標群組 (綠色服務修訂版)。

1. *封裝時間*：在生產流量轉移後，藍色與綠色服務修訂版同時執行的持續時間。

1. *完成*：成功部署後，藍色服務修訂版會終止。

如果在部署期間偵測到問題，Amazon ECS 可以透過將流量路由回主要目標群組 (藍色服務修訂版) 實現自動復原。