

# Amazon ECS ブルー/グリーン、リニアおよびカナリアデプロイの 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 を使用したブルー/グリーンデプロイの場合、2 つのターゲットグループを作成する必要があります。
+ ブルーサービスリビジョンのプライマリターゲットグループ (現在の本番トラフィック)
+ グリーンサービスリビジョン (新しいサービスリビジョン) の代替ターゲットグループ

両方のターゲットグループは、次の設定で構成する必要があります。
+ ターゲットタイプ: `ip` (`awsvpc`ネットワークモードの Fargate または 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 に使用する 2 つのターゲットグループを作成します。  

```
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
+ サブネット: 異なるアベイラビリティーゾーンに少なくとも 2 つのサブネット

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 はトラフィックをプライマリターゲットグループ (ブルーサービスリビジョン) に戻すことで、自動的にロールバックできます。