はじめに

Amazon ECSでコンテナアプリケーションを本番運用する際、ネットワーク設計とロードバランサー連携は避けて通れない重要なテーマです。適切に設計されたネットワーク構成は、セキュリティ、可用性、パフォーマンスのすべてに直結します。

しかし、ECSのネットワークモード(awsvpc)の理解、VPCとサブネットの役割分担、セキュリティグループの設計、ALBとの連携設定など、考慮すべき要素が多く、初めて構築する際は戸惑うことも少なくありません。

本記事では、ECSサービスのネットワーク設計とALB連携について、全体像から具体的な設定手順まで体系的に解説します。

この記事を読むことで、以下のことが理解できるようになります。

  • ECSのawsvpcネットワークモードの仕組みと特徴
  • ECS向けVPC・サブネット設計のベストプラクティス
  • ALB、ターゲットグループ、セキュリティグループの連携設定
  • パブリック/プライベート構成のユースケース別設計パターン

ECSネットワーク設計の全体像

awsvpcネットワークモードとは

Fargateを使用するECSでは、awsvpcネットワークモードが必須です。このモードでは、各タスクにElastic Network Interface(ENI)が割り当てられ、VPC内の他のリソースと同様にIPアドレスを持ちます。

flowchart TB
    subgraph VPC["VPC (10.0.0.0/16)"]
        subgraph PublicSubnet["パブリックサブネット"]
            ALB["ALB<br/>ENI"]
        end
        
        subgraph PrivateSubnet["プライベートサブネット"]
            subgraph Task1["タスク1"]
                ENI1["ENI<br/>10.0.11.15"]
                Container1["コンテナ"]
            end
            subgraph Task2["タスク2"]
                ENI2["ENI<br/>10.0.12.28"]
                Container2["コンテナ"]
            end
        end
    end
    
    Internet((インターネット)) --> ALB
    ALB --> ENI1
    ALB --> ENI2

awsvpcモードの主な特徴は以下のとおりです。

特徴 説明
タスクごとのENI 各タスクが独自のネットワークインターフェースを持つ
VPCレベルのネットワーク セキュリティグループやNACLをタスク単位で適用可能
プライベートIPの割り当て タスクにVPC内のプライベートIPアドレスが付与される
ポートマッピングの簡素化 コンテナポートがそのままホストポートとして公開される

ネットワーク構成の設計パターン

ECSサービスのネットワーク構成は、大きく2つのパターンに分類されます。

パターン1: パブリックサブネット構成

タスクをパブリックサブネットに配置し、パブリックIPを割り当てる構成です。

flowchart TB
    subgraph VPC["VPC"]
        IGW["インターネット<br/>ゲートウェイ"]
        
        subgraph PublicSubnet["パブリックサブネット"]
            ALB["ALB"]
            Task1["タスク<br/>パブリックIP付与"]
            Task2["タスク<br/>パブリックIP付与"]
        end
    end
    
    Internet((インターネット)) --> IGW
    IGW --> ALB
    ALB --> Task1
    ALB --> Task2
    Task1 -.->|外部API呼び出し| IGW
項目 内容
用途 開発環境、小規模システム
メリット 構成がシンプル、NAT Gatewayコスト不要
デメリット タスクがインターネットに直接公開される可能性
assignPublicIp ENABLED

パターン2: プライベートサブネット構成(推奨)

タスクをプライベートサブネットに配置し、ALBのみをパブリックサブネットに配置する構成です。

flowchart TB
    subgraph VPC["VPC"]
        IGW["インターネット<br/>ゲートウェイ"]
        NAT["NAT Gateway"]
        
        subgraph PublicSubnet["パブリックサブネット"]
            ALB["ALB"]
        end
        
        subgraph PrivateSubnet["プライベートサブネット"]
            Task1["タスク"]
            Task2["タスク"]
        end
    end
    
    Internet((インターネット)) --> IGW
    IGW --> ALB
    ALB --> Task1
    ALB --> Task2
    Task1 -.->|外部API呼び出し| NAT
    NAT --> IGW
項目 内容
用途 本番環境、セキュリティ要件が厳しいシステム
メリット タスクがインターネットから隔離される
デメリット NAT Gatewayのコストが発生
assignPublicIp DISABLED

本番環境では、パターン2のプライベートサブネット構成を推奨します。

VPCとサブネットの設計

ECS向けVPCの要件

ECSサービスをデプロイするVPCには、以下の要件があります。

要件 説明
DNS解決の有効化 enableDnsSupport: true(ECRやCloudWatchへのアクセスに必要)
DNSホスト名の有効化 enableDnsHostnames: true(VPCエンドポイント利用時に必要)
十分なIPアドレス空間 タスクごとにIPを消費するため、余裕を持った設計が必要

サブネット設計のベストプラクティス

CIDR設計の考慮点

ECSのawsvpcモードでは、タスクごとにIPアドレスを1つ消費します。サブネットのCIDRは、想定される最大タスク数を考慮して設計します。

サブネットサイズ 利用可能IP数 推奨用途
/24 251個 中規模サービス
/23 507個 大規模サービス
/22 1019個 複数サービスを配置

AWSでは各サブネットで5つのIPアドレスが予約されるため、実際に利用可能なIP数は2^(32-プレフィックス) - 5となります。

マルチAZ構成

可用性を確保するため、複数のアベイラビリティゾーン(AZ)にサブネットを配置します。

flowchart TB
    subgraph VPC["VPC (10.0.0.0/16)"]
        subgraph AZa["AZ-a"]
            PublicA["パブリック<br/>10.0.1.0/24"]
            PrivateA["プライベート<br/>10.0.11.0/24"]
        end
        
        subgraph AZc["AZ-c"]
            PublicC["パブリック<br/>10.0.2.0/24"]
            PrivateC["プライベート<br/>10.0.12.0/24"]
        end
        
        subgraph AZd["AZ-d"]
            PublicD["パブリック<br/>10.0.3.0/24"]
            PrivateD["プライベート<br/>10.0.13.0/24"]
        end
    end

ECSサービスの設定で複数のサブネットを指定すると、タスクは自動的に各AZに分散配置されます。

ルートテーブルの設定

パブリックサブネットとプライベートサブネットでは、ルートテーブルの設定が異なります。

パブリックサブネット用ルートテーブル

送信先 ターゲット 説明
10.0.0.0/16 local VPC内通信
0.0.0.0/0 igw-xxxxx インターネットへのルート

プライベートサブネット用ルートテーブル

送信先 ターゲット 説明
10.0.0.0/16 local VPC内通信
0.0.0.0/0 nat-xxxxx NAT Gateway経由のインターネットアクセス

セキュリティグループの設計

ECSとALBを連携させる場合、最低3種類のセキュリティグループを設計します。

セキュリティグループの全体構成

flowchart LR
    Internet((インターネット)) --> SG_ALB
    
    subgraph SG_ALB["ALB用SG"]
        ALB["ALB"]
    end
    
    subgraph SG_ECS["ECSタスク用SG"]
        Task1["タスク1"]
        Task2["タスク2"]
    end
    
    subgraph SG_DB["DB用SG"]
        RDS["RDS"]
    end
    
    SG_ALB -->|ポート8080| SG_ECS
    SG_ECS -->|ポート5432| SG_DB

ALB用セキュリティグループ

ALBはインターネットからのトラフィックを受け付けるため、HTTPSポートを開放します。

インバウンドルール

タイプ プロトコル ポート ソース 説明
HTTPS TCP 443 0.0.0.0/0 インターネットからのHTTPS
HTTP TCP 80 0.0.0.0/0 HTTPSリダイレクト用

アウトバウンドルール

タイプ プロトコル ポート 送信先 説明
カスタムTCP TCP 8080 sg-ecs-tasks ECSタスクへのヘルスチェックとトラフィック

ECSタスク用セキュリティグループ

ECSタスクはALBからのトラフィックのみを受け付けます。ソースにALBのセキュリティグループIDを指定することで、ALB以外からのアクセスを遮断します。

インバウンドルール

タイプ プロトコル ポート ソース 説明
カスタムTCP TCP 8080 sg-alb ALBからのトラフィック

アウトバウンドルール

タイプ プロトコル ポート 送信先 説明
HTTPS TCP 443 0.0.0.0/0 ECR、CloudWatch、外部APIへのアクセス
PostgreSQL TCP 5432 sg-database RDSへのアクセス

データベース用セキュリティグループ

データベースはECSタスクからのアクセスのみを許可します。

インバウンドルール

タイプ プロトコル ポート ソース 説明
PostgreSQL TCP 5432 sg-ecs-tasks ECSタスクからのDB接続

セキュリティグループ設計のベストプラクティス

  1. セキュリティグループIDを参照する

    • IPアドレス範囲ではなく、セキュリティグループIDをソース/送信先に指定
    • リソースの追加・削除時にルール変更が不要
  2. 最小権限の原則

    • 必要最小限のポートのみを開放
    • 0.0.0.0/0は避け、可能な限り限定的なソースを指定
  3. 命名規則の統一

    • 環境(dev/stg/prod)、用途(alb/ecs/db)を含む命名
    • 例: prod-webapp-alb-sgprod-webapp-ecs-sg

ALBの構成とターゲットグループ設定

ALBの作成

ECSサービスと連携するALBを作成します。

ALB基本設定

設定項目 説明
スキーム internet-facing インターネットからアクセス可能
IPアドレスタイプ IPv4 IPv4のみ使用
VPC 対象のVPC ECSと同じVPC
サブネット パブリックサブネット(複数AZ) 最低2つのAZを選択
セキュリティグループ ALB用SG 前述のセキュリティグループ

リスナー設定

本番環境では、HTTPSリスナーを設定し、HTTPはHTTPSへリダイレクトします。

flowchart LR
    Client[クライアント] -->|HTTPS:443| Listener443[HTTPSリスナー]
    Client -->|HTTP:80| Listener80[HTTPリスナー]
    
    Listener443 -->|転送| TG[ターゲットグループ]
    Listener80 -->|リダイレクト| Listener443

HTTPリスナーのリダイレクト設定:

設定項目
アクションタイプ リダイレクト
プロトコル HTTPS
ポート 443
ステータスコード HTTP_301

ターゲットグループの作成

ECSサービスと連携するターゲットグループを作成します。ターゲットタイプはipを選択します。

基本設定

設定項目 説明
ターゲットタイプ IP Fargate/awsvpcモードでは必須
プロトコル HTTP コンテナへの転送プロトコル
ポート 8080 コンテナが公開するポート
VPC 対象のVPC ECSと同じVPC
プロトコルバージョン HTTP1 または HTTP2/gRPC

ヘルスチェック設定

ヘルスチェックはコンテナの正常性を監視し、異常なタスクへのトラフィック転送を停止します。

設定項目 推奨値 説明
プロトコル HTTP ヘルスチェック用プロトコル
パス /health アプリケーションのヘルスエンドポイント
正常のしきい値 2 正常判定に必要な連続成功回数
異常のしきい値 3 異常判定に必要な連続失敗回数
タイムアウト 5秒 レスポンス待機時間
間隔 30秒 ヘルスチェック実行間隔
成功コード 200 正常と判定するHTTPステータス

ヘルスチェックパスには、アプリケーションの軽量なエンドポイントを指定します。データベース接続確認を含める場合は、タイムアウト値を適切に設定してください。

ターゲットグループの属性設定

属性 推奨値 説明
登録解除の遅延 30秒 ターゲット削除前の待機時間
スロースタート 0秒(無効) 新規ターゲットへのトラフィック増加時間
スティッキーセッション 無効 セッション状態をサーバーに持たない設計を推奨

登録解除の遅延(Deregistration Delay)は、タスク停止時に進行中のリクエストを完了させるための猶予時間です。アプリケーションの処理時間に応じて調整します。

ECSサービスとALBの連携

サービス作成時のネットワーク設定

ECSサービスを作成する際、ネットワーク設定とロードバランサー設定を行います。

flowchart TB
    subgraph ECSService["ECSサービス設定"]
        Network["ネットワーク構成<br/>VPC / サブネット / SG"]
        LB["ロードバランサー<br/>ALB / ターゲットグループ"]
        Task["タスク定義<br/>コンテナ / ポート"]
    end
    
    subgraph Resources["AWSリソース"]
        VPC["VPC"]
        Subnet["サブネット"]
        SG["セキュリティグループ"]
        ALB["ALB"]
        TG["ターゲットグループ"]
    end
    
    Network --> VPC
    Network --> Subnet
    Network --> SG
    LB --> ALB
    LB --> TG

ネットワーク構成パラメータ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "subnet-private-a",
        "subnet-private-c"
      ],
      "securityGroups": [
        "sg-ecs-tasks"
      ],
      "assignPublicIp": "DISABLED"
    }
  }
}
パラメータ 説明
subnets タスクを配置するサブネット(複数AZ推奨)
securityGroups タスクに適用するセキュリティグループ
assignPublicIp パブリックIP割り当て(プライベートサブネットではDISABLED)

ロードバランサー構成パラメータ

1
2
3
4
5
6
7
8
9
{
  "loadBalancers": [
    {
      "targetGroupArn": "arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-app-tg/xxxxxxxxxx",
      "containerName": "app",
      "containerPort": 8080
    }
  ]
}
パラメータ 説明
targetGroupArn 連携するターゲットグループのARN
containerName トラフィックを受けるコンテナ名(タスク定義内の名前)
containerPort コンテナが公開するポート番号

AWS CLIでのサービス作成例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
aws ecs create-service \
  --cluster my-cluster \
  --service-name my-web-service \
  --task-definition my-web-app:1 \
  --desired-count 2 \
  --launch-type FARGATE \
  --platform-version LATEST \
  --network-configuration "awsvpcConfiguration={
    subnets=[subnet-xxxxxxxx,subnet-yyyyyyyy],
    securityGroups=[sg-xxxxxxxx],
    assignPublicIp=DISABLED
  }" \
  --load-balancers "targetGroupArn=arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-app-tg/xxxxxxxxxx,containerName=app,containerPort=8080" \
  --health-check-grace-period-seconds 60 \
  --scheduling-strategy REPLICA \
  --deployment-configuration "maximumPercent=200,minimumHealthyPercent=100" \
  --region ap-northeast-1

重要パラメータの解説

パラメータ 説明 推奨値
health-check-grace-period-seconds サービス開始後、ヘルスチェックを猶予する時間 60-120秒
scheduling-strategy タスク配置戦略 REPLICA
maximumPercent デプロイ時の最大タスク数(%) 200
minimumHealthyPercent デプロイ時の最小稼働タスク数(%) 100

health-check-grace-period-secondsは、コンテナの起動時間を考慮して設定します。この期間中はALBのヘルスチェック失敗がサービスの異常としてカウントされません。

プライベートサブネット構成の詳細

NAT Gateway経由のインターネットアクセス

プライベートサブネットに配置したECSタスクが外部サービスにアクセスする場合、NAT Gatewayを経由します。

flowchart TB
    subgraph VPC["VPC"]
        subgraph PublicSubnet["パブリックサブネット"]
            NAT["NAT Gateway"]
            IGW["インターネット<br/>ゲートウェイ"]
        end
        
        subgraph PrivateSubnet["プライベートサブネット"]
            Task["ECSタスク"]
        end
    end
    
    Task -->|ECRイメージ取得| NAT
    Task -->|CloudWatchログ送信| NAT
    Task -->|外部API呼び出し| NAT
    NAT --> IGW
    IGW --> Internet((インターネット))

NAT Gatewayは各AZに1つずつ配置することで、可用性を確保します。

VPCエンドポイントによるコスト最適化

NAT Gateway経由のトラフィックにはデータ処理料金が発生します。AWSサービスへのアクセスはVPCエンドポイントを使用することで、コストを削減できます。

flowchart LR
    subgraph PrivateSubnet["プライベートサブネット"]
        Task["ECSタスク"]
    end
    
    subgraph Endpoints["VPCエンドポイント"]
        ECR_API["ecr.api"]
        ECR_DKR["ecr.dkr"]
        S3["s3"]
        Logs["logs"]
        Secrets["secretsmanager"]
    end
    
    Task --> ECR_API
    Task --> ECR_DKR
    Task --> S3
    Task --> Logs
    Task --> Secrets

ECSで推奨されるVPCエンドポイント:

エンドポイント タイプ 用途
com.amazonaws.region.ecr.api Interface ECR API呼び出し
com.amazonaws.region.ecr.dkr Interface Dockerイメージ取得
com.amazonaws.region.s3 Gateway ECRイメージレイヤー取得
com.amazonaws.region.logs Interface CloudWatch Logsへのログ送信
com.amazonaws.region.secretsmanager Interface シークレット取得

VPCエンドポイントを使用する場合、エンドポイント用のセキュリティグループも適切に設定する必要があります。

トラフィックの流れと動作確認

リクエストの流れ

ユーザーからのリクエストがECSタスクに到達するまでの流れを確認します。

sequenceDiagram
    participant User as ユーザー
    participant DNS as Route 53
    participant ALB as ALB
    participant TG as ターゲットグループ
    participant Task as ECSタスク
    
    User->>DNS: example.com を解決
    DNS->>User: ALBのDNS名を返却
    User->>ALB: HTTPSリクエスト
    ALB->>ALB: SSL終端
    ALB->>TG: ターゲット選択
    TG->>Task: HTTPリクエスト転送
    Task->>Task: アプリケーション処理
    Task->>ALB: HTTPレスポンス
    ALB->>User: HTTPSレスポンス

動作確認のポイント

サービスデプロイ後、以下のポイントを確認します。

1. タスクの起動確認

1
2
3
4
5
6
# タスクの状態を確認
aws ecs describe-tasks \
  --cluster my-cluster \
  --tasks $(aws ecs list-tasks --cluster my-cluster --service-name my-web-service --query 'taskArns[*]' --output text) \
  --query 'tasks[*].{taskArn:taskArn,lastStatus:lastStatus,healthStatus:healthStatus}' \
  --region ap-northeast-1

期待される状態:

  • lastStatus: RUNNING
  • healthStatus: HEALTHY

2. ターゲットグループのヘルスチェック確認

1
2
3
4
# ターゲットヘルス確認
aws elbv2 describe-target-health \
  --target-group-arn arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/my-app-tg/xxxxxxxxxx \
  --region ap-northeast-1

期待される状態:

  • State: healthy

3. ALB経由のアクセス確認

1
2
# ALB DNSへのアクセステスト
curl -v https://my-alb-xxxxx.ap-northeast-1.elb.amazonaws.com/health

トラブルシューティング

よくある問題と対処法を以下にまとめます。

症状 原因 対処法
タスクがPENDINGのまま サブネットのIP枯渇 サブネットのCIDRを拡張
タスクがSTOPPED イメージ取得失敗 VPCエンドポイントまたはNAT Gatewayを確認
ターゲットがunhealthy セキュリティグループの設定ミス ALBからECSタスクへのポート許可を確認
接続タイムアウト ルートテーブルの設定ミス サブネットのルートテーブルを確認

本番環境向けのベストプラクティス

可用性の確保

  1. マルチAZ配置

    • ALBは最低2つのAZのパブリックサブネットに配置
    • ECSタスクは複数AZのプライベートサブネットに分散
  2. 適切なタスク数の設定

    • 最小タスク数は2以上を推奨(1AZ障害時も継続稼働)
    • Auto Scalingで負荷に応じたスケーリングを設定
  3. ヘルスチェックの最適化

    • アプリケーションの起動時間を考慮した猶予期間の設定
    • 適切なしきい値で迅速な異常検知と誤検知防止のバランス

セキュリティの強化

  1. 最小権限の原則

    • セキュリティグループは必要最小限のポートのみ開放
    • タスクロールにはアプリケーションに必要な権限のみ付与
  2. 通信の暗号化

    • ALBでSSL/TLS終端を実施
    • 必要に応じてALB-ECS間もHTTPS化
  3. プライベートサブネットの活用

    • コンテナはプライベートサブネットに配置
    • インターネットからの直接アクセスを遮断

コスト最適化

  1. VPCエンドポイントの活用

    • ECR、CloudWatch Logs、S3へのアクセスはエンドポイント経由
    • NAT Gatewayのデータ処理料金を削減
  2. 適切なサイジング

    • タスクのCPU/メモリは実際の使用量に基づいて設定
    • 過剰なリソース割り当てを避ける
  3. NAT Gatewayの構成

    • 開発環境では1AZに集約することも検討
    • 本番環境では各AZに配置して可用性を確保

まとめ

本記事では、ECSサービスのネットワーク設計とALB連携について解説しました。主要なポイントは以下のとおりです。

  • awsvpcネットワークモードにより、タスクごとにENIが割り当てられ、VPCレベルのネットワーク制御が可能
  • プライベートサブネット構成を採用し、ECSタスクをインターネットから隔離することでセキュリティを強化
  • セキュリティグループはALB用、ECSタスク用、DB用を分離し、セキュリティグループIDを参照して連携
  • ターゲットグループはターゲットタイプをIPに設定し、適切なヘルスチェックを構成
  • VPCエンドポイントを活用してNAT Gatewayのコストを最適化

適切なネットワーク設計は、ECSサービスの可用性、セキュリティ、運用性のすべてに影響します。本記事の内容を参考に、要件に応じた最適な構成を検討してください。

参考リンク