[アップデート] Amazon ECS が Network Load Balancer での線形デプロイ・カナリアデプロイをサポートしました!

[アップデート] Amazon ECS が Network Load Balancer での線形デプロイ・カナリアデプロイをサポートしました!

2026.02.20

こんにちは。
熱々お風呂にカナリアデプロイ
オペレーション部のかわいです。

タイトルのとおり、ECS が NLB での線形・カナリアデプロイに対応したので紹介します。
2026年2月4日、Amazon ECS (Elastic Container Service) が Network Load Balancer (NLB) での線形デプロイメント・カナリアデプロイメントをサポート開始
https://aws.amazon.com/about-aws/whats-new/2026/02/amazon-ecs-nlb-linear-canary-deployments

以前まで ECS の段階的デプロイ(線形・カナリア)は Application Load Balancer (ALB) または ECS Service Connect でのみ利用可能で、NLB では Blue/Green デプロイのみがサポートされていました。

このアップデートにより NLB を使用するアプリケーションでも、リスクの低い段階的デプロイが可能になりました。

【参考】
https://dev.classmethod.jp/articles/ecs-built-in-linear-canary-deployment/

本記事ではこの新機能の詳細と、実際に NLB を使った線形デプロイを簡易的に検証した結果を備忘録がてらに残したいと思います。

もう少し詳しく

今回のアップデートで、NLB を使った ECS サービスでも線形デプロイとカナリアデプロイが利用可能になりました。
NLB は L4(TCP/UDP)のロードバランサのため、ALB のような HTTP(L7)ルーティングではなく L4トラフィックを負荷分散しますが、今回の対応により NLB 利用時でも段階的にトラフィックを切り替えるデプロイが可能になります。

【線形デプロイメント(Linear Deployment)】

一定の間隔で、トラフィックを段階的に新バージョンにシフトします。

線形


【カナリアデプロイメント(Canary Deployment)】

最初に少量のトラフィックを新バージョンにシフトし、一定時間待った後に残りを一気に切り替えます。

カナリア


検証

検証環境

今回は以下の環境で線形デプロイを検証します。

項目 設定値
リージョン ap-northeast-1(東京)
VPC 既存VPC(パブリックサブネット × 2)
ECS Fargate 起動タイプ
コンテナイメージ nginx:1.25 → nginx:1.26
タスクスペック 0.25 vCPU / 0.5 GB × 2タスク
ロードバランサー Network Load Balancer (NLB)
デプロイ戦略 線形デプロイ(1分ごとに20%ずつシフト)

※検証を簡易的に行うためパブリックサブネットにタスクを配置し、Fargate にパブリック IP を付与します。
※線形デプロイの挙動を確認するには最低2タスク必要です。

1. タスク定義の作成

ECS コンソールで以下設定のタスク定義を作成します(細かい手順は省略)。

タスク定義 test-app:1

設定項目
ファミリー test-app
起動タイプ AWS Fargate
CPU 0.25 vCPU
メモリ 0.5 GB
コンテナ名 nginx
イメージURI nginx:1.25
ポートマッピング 80/TCP

2. ECS サービスの作成

ここで線形デプロイを設定します。

ECS クラスター test-nlb-cluster を作成後、サービスを作成します。

【環境設定】

  • 既存のクラスター: test-nlb-cluster
  • 起動タイプ: Fargate
  • サービスロール: 空白(AWSが自動的にAWSServiceRoleForECSを作成)

【デプロイ設定】

  • タスク定義: test-app:1
  • サービス名: test-service
  • 必要なタスク: 2

▼ここで2タスク指定します
desired_tasks

【ネットワーキング】

  • VPC: 既存VPC
  • サブネット: パブリックサブネット×2
  • セキュリティグループ: TCP (80) の Inbound を許可
    • ※ Fargate + NLB(ターゲットタイプ IP)ではクライアントIPが保持されるため、検証元のソースIPアドレスのみを許可してください。
  • パブリック IP: 有効化

【ロードバランサ】

  • ロードバランサーの種類: Network Load Balancer
  • ロードバランサー: 事前に作成した NLB を選択
  • リスナー: TCP:80
  • ターゲットグループ: 事前に作成したターゲットグループを選択

【デプロイ設定】

ここで NLB での線形デプロイ を設定します。
このオプションで NLB を選択可能になったことが今回の新機能です。

  • デプロイタイプ: 線形(Linear)
    • Linear step bake time(トラフィックシフト間隔): 1分
    • Linear step percent(シフト増分): 20%
    • Deployment bake time(最終待機時間): 1分

線形デプロイ設定

これにより、以下のようにトラフィックがシフトします。

  • 0分: 0% → 新バージョン(旧バージョンのみ)
  • 1分: 20% → 新バージョン
  • 2分: 40% → 新バージョン
  • 3分: 60% → 新バージョン
  • 4分: 80% → 新バージョン
  • 5分: 100% → 新バージョン(デプロイ完了、約5分)

※本番環境では、より長い間隔(例: 3分ごと10%ずつ等)が推奨されます。

サービス作成後に2つのタスクが RUNNING になり、NLB のターゲットグループで healthy になることを確認します。

3. タスク定義の更新とデプロイ実行

新バージョンのタスク定義 test-app:2 を作成します。

task_difinitions

変更点:

  • コンテナイメージ: nginx:1.25nginx:1.26 に変更

その後 ECS サービスを更新し、タスク定義を test-app:2 に変更します。

4. トラフィックシフトの確認

サービスをリビジョン2に変更し、更新します。

update_service

a) ECS サービスの「デプロイとイベント」タブ

ECS コンソールでトラフィックシフトの進行状況をリアルタイムで確認できます。

デプロイ進行中は、以下のように表示されます。

  Started at                      Message
  ----------------------------------------------------------------------
  20 February 2026, 17:59 (UTC+9:00)
  service test-service has reached a steady state.

  20 February 2026, 17:59 (UTC+9:00)
  service test-service deployment ecs-svc/xxxxxxxxxxxxxxxxxxxxx deployment completed.

  20 February 2026, 17:58 (UTC+9:00)
  (service test-service, taskSet ecs-svc/xxxxxxxxxxxxxxxxxxxxx) has begun draining connections on 1 tasks.

  20 February 2026, 17:58 (UTC+9:00)
  service test-service deregistered 1 targets in target-group test-nlb-tg-ecs

  20 February 2026, 17:57 (UTC+9:00)
  service test-service has stopped 1 running tasks: task xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.

  20 February 2026, 17:57 (UTC+9:00)
  (service test-service, taskSet ecs-svc/xxxxxxxxxxxxxxxxxxxxx) has begun draining connections on 1 tasks.

  20 February 2026, 17:57 (UTC+9:00)
  service test-service deregistered 1 targets in target-group test-nlb-tg-ecs

  20 February 2026, 17:57 (UTC+9:00)
  service test-service has stopped 1 running tasks: task xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.

  20 February 2026, 17:56 (UTC+9:00)
  service test-service registered 1 targets in target-group test-nlb-tg-ecs

  20 February 2026, 17:56 (UTC+9:00)
  service test-service has started 1 tasks: task xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

b) 実際のトラフィックシフトを確認する方法

NLB の DNS 名に対して継続的にリクエストを送信し、レスポンスヘッダーから nginx のバージョンを確認するスクリプトをまわします。マシンには今回 Ubuntu を使用しました。

  # NLB の DNS 名を環境変数に設定
  NLB_DNS="test-nlb-ecs-deploy-xxxxxxxxx.elb.ap-northeast-1.amazonaws.com"

  # ログファイル名(タイムスタンプ付き)
  LOG_FILE="nlb-deployment-$(date '+%Y%m%d-%H%M%S').txt"

  echo "ログファイル: $LOG_FILE"
  echo "デプロイ監視開始: $(date)" | tee -a $LOG_FILE

  # 5秒ごとにリクエストを送信してServerヘッダーを確認(画面とログファイル両方に出力)
  while true; do
    echo "$(date '+%H:%M:%S') - $(curl -sI http://$NLB_DNS | grep -i '^Server:' | awk '{print $2}')" | tee -a $LOG_FILE
    sleep 5
  done

【出力例】

17:52:43 - nginx/1.25.5
17:52:48 - nginx/1.25.5
17:52:53 - nginx/1.25.5
17:52:58 - nginx/1.25.5
17:53:03 - nginx/1.25.5
17:53:08 - nginx/1.25.5
~~~~~
# アップデート実施後
17:56:52 - nginx/1.25.5
17:56:57 - nginx/1.25.5
17:57:02 - nginx/1.26.3
17:57:07 - nginx/1.26.3
17:57:12 - nginx/1.25.5  # 新旧が混在
17:57:17 - nginx/1.25.5
17:57:22 - nginx/1.25.5
17:57:27 - nginx/1.26.3
17:57:32 - nginx/1.26.3
17:57:37 - nginx/1.26.3
17:57:42 - nginx/1.26.3
17:57:47 - nginx/1.26.3
17:57:53 - nginx/1.26.3
17:57:58 - nginx/1.26.3
17:58:03 - nginx/1.26.3
17:58:08 - nginx/1.26.3
17:58:13 - nginx/1.26.3  # すべて新バージョン


c) NLB ターゲットグループの確認

EC2 コンソールで NLB のターゲットグループを確認すると、以下が確認できます:

  • デプロイ開始直後: 旧バージョンのタスク2つが登録
  • トラフィックシフト中: 新バージョンのタスク2つが追加され、合計4つのターゲットが表示(ECS が自動的にトラフィックの割合を調整)。
  • トラフィックシフト完了後: 旧バージョンのタスクが削除され、新バージョンのタスク2つのみになる

まとめ的なもの

確認できたこと

今回の検証で、NLB を使用した ECS サービスで線形デプロイが正常に動作することが確認できました!

  • NLB を使用した ECS サービスで、線形デプロイメント設定が選択可能になった
  • 約3分(今回は設定よりも早かった)でデプロイが完了し、旧タスクが自動的に削除された
  • 恐らくタスク数が少ないので早く完了した(?)
  • curlスクリプトで新旧バージョンの混在状態を確認できた
  • NLB ターゲットグループで、新旧タスクの併存状態が確認できた

参考リンク

この記事をシェアする

FacebookHatena blogX

関連記事