目次

Amazon ECS 完全ガイド 2026

初心者から実務者向けの包括的解説

Amazon ECS(Elastic Container Service) は、AWS ネイティブのフルマネージドコンテナオーケストレーションサービス です。Docker コンテナを EC2(セルフマネージド)または Fargate(サーバーレス)上で実行・スケーリング・管理します。Kubernetes(EKS)より学習コストが低く、AWS サービスとの統合が深いのが特徴です。本ドキュメントは、ECS の概念・アーキテクチャ・運用・最新動向を体系的に解説する包括的ガイドです。

ドキュメントの目的

本ガイドは以下を対象としています。

  • 初心者向け: ECS とは何か、なぜ必要かを学びたい方
  • 開発者向け: コンテナアプリをデプロイしたい方
  • SRE / インフラ向け: サービスディスカバリー・Auto Scaling・本番運用を構築したい方
  • 意思決定者向け: ECS vs EKS vs Fargate vs Lambda の使い分け・投資判断

2026 年の ECS エコシステム

  • ECS Managed Instances:セルフマネージド EC2 の管理負担を軽減(2024-2025 GA)
  • Service Connect GA:ECS ネイティブのサービスメッシュ機能が一般提供
  • Fargate Spot 拡張:より多くのリージョンで利用可能、最大 70% 割引
  • AI ワークロード対応:Inferentia / Trainium チップ対応の拡大
  • Capacity Providers:EC2 / Spot / On-Demand の最適配分
  • Terraform / CDK / Pulumi:Infrastructure as Code による管理の標準化
  • Container Insights の深化:CloudWatch Logs の統合、ECS Exec による接続

定義

AWS 公式による定義:

“Amazon ECS is a fully managed container orchestration service that helps you easily run, scale, and secure Docker containers.”

複数の起動タイプ(EC2 / Fargate / ECS Anywhere)をサポートし、リアルタイムなスケーリング・ローリングアップデート・サービスディスカバリーを提供します。


目次

  1. 概要
  2. ECS が解決する課題
  3. 主な特徴
  4. アーキテクチャ
  5. 起動タイプ(EC2 / Fargate / ECS Anywhere)
  6. Fargate 詳細
  7. 主要ユースケース
  8. Task Definition
  9. ネットワーキング
  10. サービス更新戦略
  11. オートスケーリング
  12. サービス検出
  13. セキュリティ
  14. モニタリング
  15. ECS vs EKS vs Fargate vs Lambda
  16. ECS Anywhere
  17. 他の類似ツールとの比較
  18. クライアント・ツール・エコシステム
  19. ベストプラクティス
  20. トラブルシューティング
  21. 2025-2026 最新動向
  22. 学習リソース
  23. 実装例・活用シーン
  24. 導入ロードマップ
  25. 実装チェックリスト
  26. まとめ
  27. 参考文献

概要

初心者向けメモ: ECS は「コンテナを実行する」サービスです。開発者が Docker イメージを ECR(Elastic Container Registry)にプッシュし、ECS はそのイメージをクラスターで実行・スケーリングします。「Kubernetes より簡単で、AWS ネイティブ統合が深い」のが最大の特徴です。

Amazon ECS は、Docker コンテナのオーケストレーション(スケジューリング・スケーリング・管理)を自動化するフルマネージドサービスです。公式ドキュメント(ECS Developer Guide)に基づくと、単なるコンテナ実行エンジンではなく、本番グレードの運用基盤 として機能します。

ECS の位置づけ

【図1】AWS コンテナサービスの階層:

graph TD
    App[アプリケーション]
    
    subgraph Abstraction["抽象化レベル"]
        Lambda["Lambda<br/>(最高抽象化<br/>コード実行のみ)"]
        AppRunner["App Runner<br/>(高抽象化<br/>Dockerfile指定)"]
        Fargate["Fargate<br/>(中抽象化<br/>タスク定義)"]
        ECS["ECS<br/>(低抽象化<br/>完全制御)"]
        EKS["EKS<br/>Kubernetes<br/>(最低抽象化<br/>フル拡張性)"]
    end
    
    App --> Lambda
    App --> AppRunner
    App --> Fargate
    App --> ECS
    App --> EKS

ECS が解決する課題

課題 ECS の解決方法
コンテナの手動デプロイ タスク定義で自動スケジューリング、ローリングアップデート
インフラ管理の複雑さ Fargate でサーバーレス化、EC2 の管理を最小化
サービス間通信 Service Connect(ネイティブメッシュ)、Cloud Map によるサービスディスカバリー
本番環境のスケーリング Target Tracking Auto Scaling、Capacity Providers による自動最適化
デプロイメント中のダウンタイム Blue/Green デプロイ、Deployment Circuit Breaker による自動ロールバック
コンテナログ管理 CloudWatch Logs への自動ロギング、Container Insights による可視化
セキュリティ管理 IAM Task Role、Secrets Manager 統合、ECR 脆弱性スキャン

主な特徴

特徴 説明
完全マネージド クラスター管理・パッチ・スケーリング の自動化(Fargate は完全サーバーレス)
複数起動タイプ EC2(セルフマネージド)/ Fargate(サーバーレス)/ ECS Anywhere(オンプレ対応)
AWS 深い統合 ALB / NLB ターゲットグループ、CloudWatch Insights、IAM タスクロール、Secrets Manager
ゼロダウンタイムデプロイ Blue/Green デプロイ、ローリングアップデート、自動ロールバック
Auto Scaling Service Auto Scaling、Cluster Auto Scaling、Capacity Providers による多次元スケーリング
サービスディスカバリー Service Connect(メッシュ)、Cloud Map(DNS)による自動検出
コスト最適化 Fargate Spot(最大 70% 割引)、Capacity Providers による ON/Spot 混合
セキュリティ Task IAM Role、Execution Role、Secrets 暗号化、ECR vulnerability scanning
モニタリング・ロギング Container Insights、CloudWatch Logs、Application Signals(トレース)
拡張性 Terraform / CDK / Copilot CLI による IaC、REST API による自動化

アーキテクチャ

初心者向けメモ: ECS は「クラスター」「タスク定義」「タスク」「サービス」の 4 層で構成されます。Docker で例えるなら、クラスター = Docker ホスト群、タスク定義 = docker-compose.yml、タスク = docker run の実行インスタンスです。

【図2】ECS の 4 層アーキテクチャ:

graph TD
    subgraph Cluster["ECS クラスター(論理的なグループ)"]
        EC2Inst["EC2 インスタンス<br/>(Container Instance)"]
        FargateServ["Fargate<br/>(サーバーレス)"]
    end
    
    subgraph Definition["Task Definition<br/>(設定テンプレート)"]
        Container["コンテナ定義<br/>(イメージ / CPU / メモリ)"]
        Volume["ボリューム定義"]
        Logging["ロギング設定"]
    end
    
    subgraph Service["Service<br/>(常時稼働管理)"]
        ASG["Auto Scaling"]
        LB["Load Balancer統合"]
        Discover["Service Discovery"]
    end
    
    subgraph Task["Task<br/>(実行インスタンス)"]
        Running["実行中のコンテナ"]
    end
    
    Definition -->|instan tiate| Task
    Cluster -->|host| Task
    Service -->|manage| Task
    Service -->|update| Definition

コアコンポーネント

1. クラスター(Cluster)

クラスターは、タスクとサービスの論理的なグループ です。

Cluster:
  ├─ 名前: my-cluster
  ├─ リージョン: ap-northeast-1
  ├─ タスク: 100 個実行中
  ├─ サービス: 5 個
  └─ Container Insights: 有効

起動タイプ別の構成:

起動タイプ ノード管理 クラスター例
EC2 インスタンスを手動 / Auto Scaling Group で管理 Cluster に EC2 インスタンスを登録
Fargate AWS が管理(ユーザーは見えない) クラスター作成のみ、インスタンス管理不要
ECS Anywhere オンプレ / VPC 外のサーバーを登録 外部ホストをクラスター「メンバー」として扱う

Cluster Auto Scaling / Capacity Providers:

Cluster Auto Scaling:
  ├─ EC2 起動タイプで Auto Scaling Group のスケーリングを自動化
  ├─ Target Capacity: 80% を目標に EC2 インスタンスを追加 / 削除
  └─ Drain: 既存タスクを他のノードに移行してから削除

2. Task Definition(タスク定義)

タスク定義は、Docker Compose 相当の設定テンプレート で、コンテナを実行するための設定を JSON で記述します。

必須フィールド:

フィールド 説明
family タスク定義の名前(バージョン管理有り、例:my-app:1, :2, …)
containerDefinitions コンテナの詳細設定(イメージ、ポート、環境変数等)
requiresCompatibilities 対応する起動タイプ(EC2, FARGATE, EXTERNAL
networkMode ネットワークドライバー(awsvpc, bridge, host
cpu / memory Fargate で必須(256, 512, 1024 等)
executionRoleArn ECS エージェントが ECR / CloudWatch Logs にアクセス時の権限
taskRoleArn タスク内のコンテナが AWS API を実行するときの権限

コンテナ定義の主要設定:

{
  "name": "web",
  "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:v1.2.3",
  "essential": true,
  "portMappings": [
    {"containerPort": 8080, "hostPort": 8080, "protocol": "tcp"}
  ],
  "environment": [
    {"name": "NODE_ENV", "value": "production"}
  ],
  "secrets": [
    {
      "name": "DB_PASSWORD",
      "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/db/password"
    }
  ],
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/ecs/my-app",
      "awslogs-region": "ap-northeast-1",
      "awslogs-stream-prefix": "ecs"
    }
  },
  "healthCheck": {
    "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
    "interval": 30,
    "timeout": 5,
    "retries": 3,
    "startPeriod": 60
  }
}

3. Task(タスク)

タスクは、タスク定義を実行した具体的なインスタンス です。

Task:
  ├─ Task ID: arn:aws:ecs:ap-northeast-1:123456789012:task/my-cluster/abc123
  ├─ Task Definition: my-app:5
  ├─ Launch Type: FARGATE
  ├─ Status: RUNNING
  ├─ IP: 10.0.1.50(Fargate / awsvpc の場合)
  ├─ Created: 2026-04-26T10:30:00Z
  └─ CPU / Memory: 512 vCPU / 1024 MB

タスクの種類:

種類 用途 特性
Service 内のタスク Webサーバー等、常時稼働の役割 終了後は自動再起動
スタンドアロンタスク バッチ処理、一度限りのジョブ 完了後は停止
Scheduled Task 定期実行(CloudWatch Events で起動) 定期的にスケジュール実行

4. Service(サービス)

サービスは、指定したタスク数(desired count)を常時維持 し、スケーリング・デプロイ・サービスディスカバリーを管理します。

Service:
  ├─ 名前: my-web-service
  ├─ タスク定義: my-app:5
  ├─ 起動タイプ: FARGATE
  ├─ Desired Count: 3(常に 3 タスクを稼働)
  ├─ Running Count: 3
  ├─ Pending Count: 0
  ├─ Load Balancer: ALB/TargetGroup を自動登録
  ├─ Auto Scaling: CPU 60% で最大 10 タスクまでスケールアウト
  ├─ Deployment Strategy: Rolling(minimumHealthyPercent: 100, maximumPercent: 200)
  └─ Service Discovery: Cloud Map / Service Connect で DNS 登録

起動タイプ

初心者向けメモ: 「どこでコンテナを実行するか」で 3 つの選択肢があります。新規は Fargate が推奨、コスト最適化が必要なら EC2、既存インフラなら ECS Anywhere です。

1. Fargate(サーバーレス)

AWS がインフラを完全管理し、ユーザーはタスク定義を指定するだけ。

特徴:

  • ✅ インフラ管理不要(EC2 インスタンス管理不要)
  • ✅ 秒単位の課金(実行時間のみ)
  • ✅ セキュリティが強化(各タスクが独立した実行環境)
  • ❌ カスタマイズが限定的(GPU なし、ボリュームタイプ限定)
  • ❌ EC2 より割高(ただし小規模 / 変動ワークロードには割安)

推奨ユースケース:

  • 新規アプリケーション
  • トラフィックが変動するアプリ(スパイク対応)
  • マイクロサービス個別スケーリング

料金(US East 1, 2026):

  • CPU: $0.04048 / vCPU / 時
  • メモリ: $0.004445 / GB / 時
  • : 0.5 vCPU + 1 GB × 24h = $0.968 / 日

2. EC2(セルフマネージド)

ユーザーが EC2 インスタンスをクラスターに登録し、ECS がタスクをスケジュールします。

特徴:

  • ✅ コスト最適化(EC2 On-Demand / Spot 混合)
  • ✅ 完全にカスタマイズ可能(GPU、大容量ストレージ)
  • ✅ 大規模ワークロード向け
  • ❌ インフラ管理の負担(AMI 更新、パッチ、キャパシティプランニング)
  • ❌ 起動遅延(インスタンス起動 1-3 分)

推奨ユースケース:

  • 大規模本番環境
  • GPU / 特殊ハードウェアが必要
  • コスト最適化が重要

料金:

  • EC2 インスタンス料金のみ(ECS のオーバーヘッドなし)
  • : t3.medium × 3(常時稼働)≈ $70 / 月

3. ECS Anywhere(ハイブリッド)

オンプレミス / VPC 外のサーバーをクラスターに登録し、ECS で管理します。

特徴:

  • ✅ 既存インフラの活用
  • ✅ ハイブリッドクラウドに対応
  • ❌ インフラ管理の負担(Anywhere エージェント管理)
  • ❌ ネットワーク設定の複雑さ

推奨ユースケース:

  • オンプレミスからクラウドへの段階的移行
  • データセンター内の既存サーバーの再利用

Fargate 詳細

Fargate の動作モデル

【図3】Fargate の実行フロー:

graph LR
    User["ユーザー<br/>(タスク定義指定)"]
    Queue["キュー<br/>(リクエスト受け取り)"]
    Scheduler["ECS スケジューラ"]
    Placement["リソース配置<br/>(自動選択)"]
    Launch["Fargate ENI<br/>(起動)"]
    Running["タスク実行"]
    Monitor["CloudWatch<br/>(監視)"]
    
    User -->|タスク定義| Queue
    Queue -->|スケジュール| Scheduler
    Scheduler -->|最適ホスト| Placement
    Placement -->|起動| Launch
    Launch -->|実行| Running
    Running -->|メトリクス| Monitor

コンテナレベル課金

Fargate は コンテナが実際に稼働した時間のみ課金 されます。

  • 利点: スケーリングイン時に不要なコンテナを削除 → 即座に課金停止

【表】Fargate リソース仕様と料金(US East 1, 2026):

vCPU メモリ(GB) 月額($)* 用途
0.25 0.5 / 1 / 2 ~17 低負荷、開発・テスト
0.5 1 / 2 / 3 / 4 ~35 小規模 Web / API
1 2 / 3 / 4 / 5 / 6 / 7 / 8 ~68 標準的な Web アプリ
2 4 / 5 / 6 / 7 / 8 / … / 30 ~137 中規模アプリ
4 8 / 9 / … / 30 ~274 高スループット

*概算値(CPU 0.04048/h + Memory 0.004445/h)

Fargate Spot

Fargate Spot は、未利用の Fargate キャパシティを 最大 70% 割引 で利用できます。

特徴:

  • ✅ コスト削減(最大 70%)
  • ✅ Spot インスタンスより安定(ユーザー数が少ない時間帯でも利用可)
  • ❌ 中断リスク(AWS がキャパシティを要求した場合に中断)

推奨ユースケース:

  • バッチ処理
  • キャッシュ / 一時的なデータ処理
  • 成功 / 失敗を許容できるワークロード

組み合わせ戦略:

Service: Desired Count = 10
  ├─ Fargate ON-Demand: 5 タスク(ベースロード、安定)
  └─ Fargate Spot: 5 タスク(ピーク対応、コスト削減)
  
結果: 月額 ~$340(Spot なし $510 vs Spot あり $340 = 33% 削減)

Graviton(ARM ベース CPU)

AWS Graviton プロセッサ(ARM ベース)で実行し、さらに 20% コスト削減 が可能。

特徴:

  • ✅ コスト最適化(20-30% 削減)
  • ✅ 高性能(同じ vCPU でも x86 より高速な場合あり)
  • ❌ アプリが ARM に対応している必要がある

Graviton 対応確認:

# イメージが ARM 対応か確認
docker pull myrepo/myimage:latest
docker inspect myrepo/myimage:latest | grep -i 'arm64\|amd64'

# Dockerfile で ARM マルチアーキ対応
FROM --platform=$BUILDPLATFORM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN GOOS=linux GOARCH=$TARGETARCH go build -o app .

FROM --platform=$TARGETPLATFORM alpine:latest
COPY --from=builder /app/app /
CMD ["/app"]

主要ユースケース

1. Web / API サーバー

トポロジー:
  ALB → Target Group → ECS Service (Fargate, Desired=3, Auto Scaling)
  
特徴:
  - ALB がヘルスチェック、トラフィック分散
  - Service が Auto Scaling で負荷対応
  - ローリングアップデートで無停止デプロイ

2. マイクロサービスアーキテクチャ

サービス A (ECS)
  ├─ Service Connect → Cloud Map DNS
  ├─ Task IAM Role → Service B API 呼び出し
  └─ CloudWatch Logs → 集約ログ

Service B (ECS)
  ├─ Service Connect DNS: serviceb.local
  └─ 自動スケーリング

Service C (ECS)
  └─ 非同期処理(SQS → Lambda / ECS)

3. バッチ処理

CloudWatch Events → ECS RunTask → 処理実行 → 終了
  ├─ スケジュール: cron(0 2 * * ?)
  ├─ コスト: 実行時間のみ課金
  └─ 例: 日次 ETL、データクリーニング

4. 機械学習推論

ECS Service (GPU 対応 EC2) → SageMaker Endpoint の代替
  ├─ 低レイテンシ推論
  ├─ リアルタイムスケーリング
  └─ カスタムモデル運用

5. Daemonset パターン

Cluster の全ノードで 1 つずつ実行:
  ├─ ログコレクター(Fluentd / LogStash)
  ├─ モニタリングエージェント(DataDog / NewRelic)
  ├─ セキュリティエージェント(Wazuh)
  └─ ECS Placement Strategy: spread

6. CI/CD エージェント

GitLab Runner / GitHub Actions self-hosted を ECS で実行:
  ├─ ECS タスク = CI ジョブ実行環境
  ├─ Auto Scaling で同時実行数を制御
  └─ 実行後にタスク削除(費用削減)

7. ゲーム バックエンドサーバー

Game Client → ALB → ECS Game Server
  ├─ WebSocket / gRPC サポート
  ├─ リアルタイムスケーリング(プレイヤー数に応じて)
  ├─ Blue/Green デプロイで無停止アップデート
  └─ Regional デプロイ(複数リージョン)で低レイテンシ

8. ストリーム処理

Kinesis / Kafka → ECS Consumer
  ├─ リアルタイムデータ処理
  ├─ スケーリング: スキップ数に応じて Auto Scaling
  └─ Fargate で効率的(変動負荷対応)

9. ETL パイプライン

S3 / RDS / API → ECS Data Pipeline → Data Warehouse
  ├─ スケジュール / イベントドリブン実行
  ├─ 失敗時の自動リトライ
  └─ Spot インスタンスで コスト最適化

10. 音声 / ビデオ処理

ECS + GPU (EC2 g4dn) → FFmpeg / TensorFlow
  ├─ リアルタイム変換
  ├─ バッチ処理
  └─ コスト: GPU 料金 + ECS (Spot)

11. Web スクレイピング

CloudWatch Events → ECS Task
  ├─ 定期実行スクレイピング
  ├─ IP rotation(複数タスク)
  └─ データベース保存

12. チャットボット / AI エージェント

API Gateway → ALB → ECS LLM Service
  ├─ LLM API(OpenAI / Claude / Anthropic)統合
  ├─ リアルタイムスケーリング
  └─ メモリ最適化(Graviton)

Task Definition

基本構造

{
  "family": "my-app",
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024",
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRoleDefault",
  "taskRoleArn": "arn:aws:iam::123456789012:role/myAppTaskRole",
  "containerDefinitions": [
    {
      "name": "web",
      "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 8080,
          "hostPort": 8080,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {"name": "NODE_ENV", "value": "production"},
        {"name": "LOG_LEVEL", "value": "info"}
      ],
      "secrets": [
        {
          "name": "DATABASE_URL",
          "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/database/url"
        },
        {
          "name": "API_KEY",
          "valueFrom": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/api/key"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-app",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs",
          "awslogs-datetime-format": "%Y-%m-%d %H:%M:%S"
        }
      },
      "healthCheck": {
        "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
        "interval": 30,
        "timeout": 5,
        "retries": 3,
        "startPeriod": 60
      },
      "mountPoints": [
        {"sourceVolume": "efs-storage", "containerPath": "/data", "readOnly": false}
      ],
      "dependsOn": [
        {"containerName": "sidecar", "condition": "START"}
      ]
    },
    {
      "name": "sidecar",
      "image": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/sidecar:latest",
      "essential": false,
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/my-app",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "sidecar"
        }
      }
    }
  ],
  "volumes": [
    {
      "name": "efs-storage",
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-12345678",
        "transitEncryption": "ENABLED"
      }
    }
  ]
}

Execution Role vs Task Role

【表】権限の役割分担:

ロール 用途
Execution Role ECS エージェントが ECR / CloudWatch / Secrets にアクセス AmazonEC2ContainerServiceTaskExecutionRolePolicy
Task Role コンテナ内のアプリが AWS API を呼び出す S3 GetObject、DynamoDB Query
// Execution Role ポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/ecs/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "ssm:GetParameters"
      ],
      "Resource": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/*"
    }
  ]
}

// Task Role ポリシー(アプリケーション権限)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::my-bucket/*"
    },
    {
      "Effect": "Allow",
      "Action": ["dynamodb:Query", "dynamodb:Scan"],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/my-table"
    }
  ]
}

ネットワーキング

ネットワークモード

初心者向けメモ: 「ネットワークモード」で、コンテナ同士・外部との通信方法が決まります。Fargate は awsvpc 固定、EC2 は複数選択肢があります。

モード 説明 用途 Fargate / EC2
awsvpc 各タスク独立した ENI(Elastic Network Interface) マイクロサービス、セキュリティグループ単位制御 ✅ Fargate(必須)
bridge ホストのポート + コンテナポートをマッピング EC2 従来型(ポート競合に注意) ❌ Fargate ✅ EC2
host ホストのネットワークスタックを共有 ハイパフォーマンス(ポート専有) ❌ Fargate ✅ EC2
none ネットワークなし(ログ出力等に使用) バッチジョブ(ネットワーク不要) ✅ Fargate / EC2

awsvpc(推奨)

Fargate Task:
  ├─ ENI: eni-12345678(VPC 内のサブネット)
  ├─ Private IP: 10.0.1.50
  ├─ Security Group: sg-web(Port 8080 許可)
  └─ Public IP: eip-xxxxx(オプション)

利点:
  ✅ タスク単位で Security Group 制御
  ✅ Service Discovery で IP 自動登録
  ✅ マイクロサービス間通信が簡単

Service Connect(ネイティブメッシュ)

ECS ネイティブのサービスメッシュで、DNS ベースのサービスディスカバリー + ロードバランシングを提供します。

Service A → Service Connect → Cloud Map DNS
  ├─ 名前: serviceb.ecs.local
  ├─ ポート: 8080
  └─ 自動ロードバランシング

設定:
{
  "name": "my-service",
  "serviceRegistries": [
    {
      "registryArn": "arn:aws:servicediscovery:ap-northeast-1:123456789012:service/...",
      "containerName": "web",
      "containerPort": 8080
    }
  ],
  "serviceConnectConfiguration": {
    "enabled": true,
    "namespace": "ecs",
    "services": [
      {
        "portName": "http",
        "discoveryName": "serviceb.ecs.local",
        "clientAliases": [
          {"port": 8080, "dnsName": "serviceb.ecs.local"}
        ]
      }
    ]
  }
}

App Mesh(高度なメッシュ機能)

AWS App Mesh は、Envoy ベースの高度なサービスメッシュを提供します。

利点:
  ✅ Circuit breaker、Retry ポリシー
  ✅ トラフィックシェイピング(Canary デプロイ)
  ✅ mTLS 自動化
  ❌ 複雑(管理コスト増加)
  
利用時期: Service Connect では不足する場合

サービス更新戦略

1. ローリングアップデート(Rolling Deployment)

特徴:

  • 古いタスク / 新しいタスクが一時的に共存
  • ダウンタイムなし(ヘルスチェック前提)
1. 新しいタスク起動
   ├─ ヘルスチェック成功待つ
   ├─ Load Balancer に登録
   └─ トラフィック流入

2. 古いタスク停止
   ├─ Connection drain(既存接続完了待つ)
   └─ 削除

設定:
{
  "deploymentConfiguration": {
    "minimumHealthyPercent": 100,  // 常に 100% 健全
    "maximumPercent": 200           // 最大 200%(2倍のタスク)
  }
}

2. Blue/Green デプロイ(CodeDeploy 統合)

完全なトラフィック切り替え戦略で、ロールバックが容易です。

【フロー】
Before: ALB → Target Group A (Blue, v1.0)

1. Green 環境を起動
   ├─ Target Group B (v2.0)
   └─ テストリスナー (Port 8080) で検証

2. トラフィック切り替え戦略
   ├─ Canary: 5% → 10% → 50% → 100%(時間かけて)
   ├─ Linear: 10% ずつ増加(10分間隔)
   └─ All at once: 即座に 100% 切り替え

3. 本番トラフィック切り替え
   ├─ 成功: Green (v2.0) を本運用化
   └─ 失敗: Blue (v1.0) に自動ロールバック

CloudWatch Alarm で監視:
  ├─ HttpCode_Target_5XX > 10
  ├─ TargetResponseTime > 5000 ms
  └─ 自動ロールバック実行

3. ECS Deployment Circuit Breaker

デプロイ失敗時に自動ロールバック。

{
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": true,
      "rollback": true
    },
    "minimumHealthyPercent": 100,
    "maximumPercent": 200
  }
}

動作:

  • デプロイ開始 → ヘルスチェック失敗(継続) → 閾値超過
  • → 自動ロールバック → 前バージョンに戻す
  • リスク低減: 失敗デプロイが本番を壊さない

オートスケーリング

1. Service Auto Scaling

ターゲットメトリクスに基づいて、タスク数を自動調整。

# ターゲット登録
aws application-autoscaling register-scalable-target \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-cluster/my-service \
  --min-capacity 2 \
  --max-capacity 20

# CPU 60% でスケール
aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-cluster/my-service \
  --policy-name cpu-scaling \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 60.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageCPUUtilization"
    },
    "ScaleInCooldown": 300,
    "ScaleOutCooldown": 60
  }'

# メモリ 70% でスケール
aws application-autoscaling put-scaling-policy \
  --service-namespace ecs \
  --scalable-dimension ecs:service:DesiredCount \
  --resource-id service/my-cluster/my-service \
  --policy-name memory-scaling \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ECSServiceAverageMemoryUtilization"
    }
  }'

2. Cluster Auto Scaling(EC2 起動タイプ)

EC2 インスタンス数を自動調整。

Capacity Provider が Auto Scaling Group の EC2 を自動追加 / 削除。

前提:
  ├─ Cluster に Capacity Provider を関連付け
  ├─ Capacity Provider が Auto Scaling Group を参照
  └─ Target Capacity を設定(例: 80%)

効果:
  新しいタスクを配置できない
  → EC2 インスタンスを自動追加
  → 使用率が低下 → インスタンス削除(Drain)

3. Capacity Providers

EC2 / Spot / On-Demand を自動混合管理。

Capacity Providers:
  ├─ ON_DEMAND: Auto Scaling Group (on-demand instances)
  ├─ SPOT: Auto Scaling Group (spot instances)
  └─ FARGATE

Service Placement Strategy:
{
  "capacityProviderStrategy": [
    {
      "capacityProvider": "FARGATE",
      "weight": 1,
      "base": 1  // 最低 1 タスクは Fargate
    },
    {
      "capacityProvider": "SPOT",
      "weight": 4  // 4 倍のウェイト(コスト削減重視)
    },
    {
      "capacityProvider": "ON_DEMAND",
      "weight": 2
    }
  ]
}

効果:
  → 新しいタスク: SPOT (4) → ON_DEMAND (2) → FARGATE (1) の優先順
  → コスト最適化 + 安定性確保

サービス検出

1. Cloud Map(DNS ベース)

ECS Service を DNS 名で登録 / 検出。

登録:
  Service Name: serviceb.my-namespace.local
  健全なタスク IP を自動登録

クライアント側:
  curl http://serviceb.my-namespace.local:8080/api
  → Cloud Map が IP に解決
  → Route53 で返却
  
利点:
  ✅ 従来的な DNS アプローチ
  ✅ クライアント側の実装不要

2. Service Connect(推奨)

Envoy サイドカー + mTLS を自動注入。

設定:
{
  "serviceConnectConfiguration": {
    "enabled": true,
    "namespace": "ecs-prod",
    "services": [
      {
        "portName": "http",
        "discoveryName": "service-b",
        "clientAliases": [
          {"port": 8080, "dnsName": "service-b.local"}
        ]
      }
    ]
  }
}

クライアント側:
  curl http://service-b:8080/api

自動機能:
  ✅ Envoy プロキシ自動注入
  ✅ サーキットブレーカー
  ✅ タイムアウト制御
  ✅ リトライ政策
  ✅ mTLS(相互認証)

セキュリティ

1. IAM ロール

// Task Execution Role(ECS エージェント権限)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetAuthorizationToken",
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:log-group:/ecs/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetSecretValue",
        "ssm:GetParameters"
      ],
      "Resource": [
        "arn:aws:secretsmanager:*:*:secret:prod/*",
        "arn:aws:ssm:*:*:parameter/prod/*"
      ]
    }
  ]
}

// Task Role(アプリケーション権限)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}

2. Secrets Manager 統合

{
  "secrets": [
    {
      "name": "DATABASE_PASSWORD",
      "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/db/password"
    },
    {
      "name": "API_KEY",
      "valueFrom": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/prod/api/key"
    }
  ]
}

3. ECR 脆弱性スキャン

# ECR スキャンを有効化
aws ecr put-image-scanning-configuration \
  --repository-name my-app \
  --image-scanning-configuration scanOnPush=true

# スキャン結果確認
aws ecr describe-image-scan-findings \
  --repository-name my-app \
  --image-id imageTag=latest

4. Task IAM Role 用途

✅ S3 バケットへのアクセス
✅ DynamoDB クエリ
✅ Secrets Manager からシークレット取得
✅ SNS / SQS メッセージ送信
✅ CloudWatch Logs 出力(明示的)
❌ 過度な権限(最小権限の原則)

モニタリング

1. CloudWatch Container Insights

ECS クラスター / サービス / タスク単位でメトリクスを収集。

有効化:
{
  "clusterSettings": [
    {
      "name": "containerInsights",
      "value": "enabled"
    }
  ]
}

メトリクス:
  ├─ Cluster: CPUUtilization, MemoryUtilization, TaskCount
  ├─ Service: DesiredCount, RunningCount, PendingCount, CPUUtilization
  └─ Task: CPUUtilization, MemoryUtilization, NetworkIn/Out, StorageRead/Write

2. CloudWatch Logs

{
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/ecs/my-app",
      "awslogs-region": "ap-northeast-1",
      "awslogs-stream-prefix": "ecs",
      "awslogs-datetime-format": "%Y-%m-%d %H:%M:%S"
    }
  }
}

3. Application Signals(トレース)

X-Ray 統合でエンドツーエンドのトレース。

# トレース有効化
aws xray create-group \
  --group-name ECS-Service \
  --filter-expression 'service("ecs-service")'

ECS vs EKS vs Fargate vs Lambda

【表】コンテナサービス比較:

観点 ECS EKS Fargate Lambda
学習コスト 低(AWS API) 高(Kubernetes) 最低(コード記述)
管理負担 中(デプロイ管理) 高(クラスター管理) 低(サーバーレス) 最低(フルマネージド)
ポータビリティ AWS 専用 マルチクラウド AWS 専用 AWS 専用
実行単位 コンテナ(タスク) コンテナ(Pod) コンテナ 関数
起動時間 秒(Fargate)分(EC2) ミリ秒
デプロイ方式 自動スケジューリング Helm / YAML ネイティブ統合 コード更新
AWS 統合 深い(IAM / ALB / SSM) アドオン必要 最深(ネイティブ) 最深
コスト On-Demand > Spot $0.10/h + EC2 従量課金 従量課金
推奨用途 本番マイクロサービス Kubernetes 標準が必要 サーバーレス / 開発 短時間処理

ECS Anywhere

オンプレミス / 外部インフラのサーバーを ECS クラスターに登録。

セットアップ:
  1. 外部ホストに SSM エージェント + ECS エージェント インストール
  2. CloudWatch Agent でメトリクス収集
  3. ECS に「External」起動タイプで登録

トポロジー:
  VPC 内の ECS
  ↔ (VPN / Direct Connect)
  ↔ オンプレミスの ECS Anywhere

利点:
  ✅ 段階的なクラウド移行
  ✅ 既存インフラの活用
  ❌ 管理複雑(ネットワーク設定)
  ❌ 高レイテンシ

他の類似ツールとの比較

ツール 特性 向いている場面
Kubernetes (EKS) 高度な拡張性、マルチクラウド 複雑なマイクロサービス、ポータビリティ重視
Docker Swarm シンプル(非推奨) 小規模環境 / 学習用
HashiCorp Nomad マルチプラットフォーム ハイブリッドクラウド / 複合ワークロード
Google Cloud Run 完全サーバーレス イベント駆動型、HTTP リクエスト処理
Azure Container Instances Azure ネイティブ Azure エコシステム
Fly.io グローバルエッジデプロイ 地理的分散、低レイテンシ

クライアント・ツール・エコシステム

1. AWS CLI

# クラスター作成
aws ecs create-cluster --cluster-name my-cluster

# サービス作成
aws ecs create-service \
  --cluster my-cluster \
  --service-name my-service \
  --task-definition my-app:5 \
  --desired-count 3 \
  --launch-type FARGATE \
  --network-configuration '{
    "awsvpcConfiguration": {
      "subnets": ["subnet-xxx"],
      "securityGroups": ["sg-xxx"]
    }
  }'

# タスク実行
aws ecs run-task \
  --cluster my-cluster \
  --task-definition my-app:5 \
  --launch-type FARGATE

2. ECS CLI(サポート終了、非推奨)

古い ECS 専用 CLI。Copilot CLI に統合。

3. AWS Copilot CLI(推奨)

モダンな ECS / App Runner デプロイツール。

# アプリケーション初期化
copilot app init my-app

# サービス作成
copilot svc init --name api --svc-type "Load Balanced Web Service"

# 環境作成(VPC / クラスター)
copilot env init --name prod

# デプロイ
copilot svc deploy --name api --env prod

# ログ確認
copilot svc logs --name api --env prod --follow

4. Terraform + ECS

resource "aws_ecs_cluster" "main" {
  name = "my-cluster"

  setting {
    name  = "containerInsights"
    value = "ENABLED"
  }
}

resource "aws_ecs_task_definition" "main" {
  family                   = "my-app"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = 512
  memory                   = 1024
  execution_role_arn       = aws_iam_role.ecsTaskExecutionRole.arn
  task_role_arn            = aws_iam_role.myTaskRole.arn

  container_definitions = jsonencode([{
    name      = "web"
    image     = "${data.aws_caller_identity.current.account_id}.dkr.ecr.${var.region}.amazonaws.com/my-app:latest"
    essential = true
    portMappings = [{
      containerPort = 8080
      hostPort      = 8080
      protocol      = "tcp"
    }]
    logConfiguration = {
      logDriver = "awslogs"
      options = {
        "awslogs-group"         = aws_cloudwatch_log_group.ecs.name
        "awslogs-region"        = var.region
        "awslogs-stream-prefix" = "ecs"
      }
    }
  }])
}

resource "aws_ecs_service" "main" {
  name            = "my-service"
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.main.arn
  desired_count   = 3
  launch_type     = "FARGATE"

  network_configuration {
    subnets          = var.private_subnet_ids
    security_groups  = [aws_security_group.alb.id]
    assign_public_ip = false
  }

  load_balancer {
    target_group_arn = aws_lb_target_group.app.arn
    container_name   = "web"
    container_port   = 8080
  }

  deployment_configuration {
    maximum_percent         = 200
    minimum_healthy_percent = 100
    deployment_circuit_breaker {
      enable   = true
      rollback = true
    }
  }
}

5. AWS CDK (Python)

from aws_cdk import (
    aws_ecs as ecs,
    aws_ec2 as ec2,
    aws_ecs_patterns as ecs_patterns,
    core
)

class EcsStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        vpc = ec2.Vpc(self, "VPC", max_azs=3)
        cluster = ecs.Cluster(self, "Cluster", vpc=vpc)

        # Fargate Service
        ecs_patterns.ApplicationLoadBalancedFargateService(
            self, "Service",
            cluster=cluster,
            memory_limit_mib=1024,
            cpu=512,
            desired_count=3,
            image=ecs.ContainerImage.from_registry(
                f"{core.Stack.of(self).account}.dkr.ecr.{core.Stack.of(self).region}.amazonaws.com/my-app:latest"
            ),
            public_load_balancer=True
        )

6. Compose-X

Docker Compose で ECS / Fargate デプロイ。

# Docker Compose を ECS に変換
compose-x render -f docker-compose.yml -o generated.yml

# AWS デプロイ
compose-x create -f docker-compose.yml

7. Pulumi

import pulumi
import pulumi_aws as aws

# クラスター
cluster = aws.ecs.Cluster("main", {
    "settings": [{
        "name": "containerInsights",
        "value": "ENABLED"
    }]
})

# タスク定義
task_definition = aws.ecs.TaskDefinition("app", {
    "family": "my-app",
    "networkMode": "awsvpc",
    "requiresCompatibilities": ["FARGATE"],
    "cpu": "512",
    "memory": "1024",
    "executionRoleArn": execution_role.arn,
    "containerDefinitions": pulumi.Output.concat(...)
})

# サービス
service = aws.ecs.Service("web", {
    "cluster": cluster.arn,
    "taskDefinition": task_definition.arn,
    "desiredCount": 3,
    "launchType": "FARGATE"
})

ベストプラクティス

1. デプロイ安全性

Deployment Circuit Breaker を有効化

{
  "deploymentConfiguration": {
    "deploymentCircuitBreaker": {
      "enable": true,
      "rollback": true
    }
  }
}

ヘルスチェック実装

{
  "healthCheck": {
    "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
    "interval": 30,
    "timeout": 5,
    "retries": 3,
    "startPeriod": 60
  }
}

Blue/Green デプロイで検証

# CodeDeploy + ALB で完全なトラフィック切り替え

2. セキュリティ

Secrets Manager / SSM Parameter Store 利用

{
  "secrets": [
    {
      "name": "DB_PASSWORD",
      "valueFrom": "arn:aws:secretsmanager:..."
    }
  ]
}

環境変数に直書き禁止

IAM Task Role で最小権限

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::my-bucket/data/*"
    }
  ]
}

ECR 脆弱性スキャン有効化

aws ecr put-image-scanning-configuration \
  --repository-name my-app \
  --image-scanning-configuration scanOnPush=true

3. スケーリング

Auto Scaling 有効化

aws application-autoscaling put-scaling-policy \
  --policy-type TargetTrackingScaling \
  --target-value 70.0

Capacity Providers で ON/Spot 混合

{
  "capacityProviderStrategy": [
    {"capacityProvider": "ON_DEMAND", "weight": 1},
    {"capacityProvider": "SPOT", "weight": 4}
  ]
}

4. ロギング・モニタリング

CloudWatch Logs 設定

{
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      "awslogs-group": "/ecs/my-app",
      "awslogs-stream-prefix": "ecs"
    }
  }
}

Container Insights 有効化

aws ecs put-cluster-setting \
  --cluster my-cluster \
  --name containerInsights \
  --value ENABLED

5. ネットワーク設計

awsvpc ネットワークモード使用

{
  "networkMode": "awsvpc",
  "requiresCompatibilities": ["FARGATE"]
}

Service Connect で自動サービスディスカバリー

{
  "serviceConnectConfiguration": {
    "enabled": true,
    "namespace": "ecs-prod"
  }
}

6. コスト最適化

Fargate Spot で 70% 削減

{
  "capacityProviderStrategy": [
    {"capacityProvider": "FARGATE_SPOT", "weight": 3},
    {"capacityProvider": "FARGATE", "weight": 1, "base": 1}
  ]
}

Graviton で 20% 削減

# Task Definition で ARM サポート確認
docker inspect my-image | grep 'arm64'

不要なタスク削除

aws ecs stop-task \
  --cluster my-cluster \
  --task <task-arn> \
  --reason "Not needed"

トラブルシューティング

1. タスクが起動しない

症状: Task Status = PROVISIONING → PENDING で止まる

原因と対策:
  ❌ Fargate リソース不足
    ✅ 別リージョンを試す、Capacity Providers を確認
  
  ❌ ECR イメージが見つからない
    ✅ ECR リポジトリ / タグを確認
    ✅ Execution Role が ecr:BatchGetImage 権限を持つか確認
  
  ❌ セキュリティグループが制限的
    ✅ アウトバウンド許可(0.0.0.0/0 確認)、ECR エンドポイント確認
  
  ❌ VPC エンドポイント設定不足
    ✅ S3 / ECR / CloudWatch Logs エンドポイント作成

2. タスクがすぐ終了する

症状: Task Status = RUNNING → STOPPED(数秒以内)

原因と対策:
  ❌ ヘルスチェック失敗
    ✅ curl コマンド実行確認: docker run ... /bin/sh -c "curl ..."
    ✅ startPeriod を長くする
  
  ❌ アプリケーションクラッシュ
    ✅ CloudWatch Logs 確認: /aws/ecs/my-app
    ✅ docker run でローカルテスト
  
  ❌ メモリ不足(OOM Kill)
    ✅ Task Definition の memory 増加
    ✅ アプリのメモリリーク確認

3. デプロイが失敗する

症状: Deployment Status = PRIMARY (Rollback)

原因と対策:
  ❌ 新タスク起動失敗
    ✅ CloudWatch Logs で詳細確認
    ✅ ECR イメージ確認
  
  ❌ ヘルスチェック失敗
    ✅ minimumHealthyPercent = 100 を下げて試す
    ✅ health check timeout / retries を調整
  
  ❌ AutoScaling 衝突
    ✅ Desired Count 確認、Scaling Policy 一時無効化

4. Auto Scaling が動作しない

症状: CPU 高騰してもタスク数が増えない

原因と対策:
  ❌ Scaling Policy 登録なし
    ✅ aws application-autoscaling put-scaling-policy で登録
  
  ❌ Max Capacity に達している
    ✅ --max-capacity を増加
  
  ❌ CloudWatch メトリクス取得失敗
    ✅ Container Insights 有効か確認
    ✅ IAM 権限確認

5. Service Discovery が動作しない

症状: Service Connect DNS が解決しない

原因と対策:
  ❌ Service Connect 未設定
    ✅ serviceConnectConfiguration.enabled = true に設定
  
  ❌ Cloud Map に登録されていない
    ✅ serviceRegistries 確認
  
  ❌ ネットワークモード awsvpc でない
    ✅ awsvpc に変更

2025-2026 最新動向

1. ECS Express Mode(2025年11月GA)

シンプルな Web / API サービス向けワンクリックデプロイ

従来:Cluster → Task Definition → Service の複数ステップ
Express Mode:Docker Compose + ワンステップで本番デプロイ

特徴:
  ✅ VPC・ロードバランサー自動作成
  ✅ CloudFormation 不要
  ✅ Copilot CLI でシンプル管理
  ✅ 開発環境から本番への段階的移行

後続:Service Connect で マイクロサービス統合

2. Service Connect GA(2025年完全サポート)

ECS ネイティブのサービスメッシュが完全一般提供。

機能:
  ✅ Envoy サイドカー自動注入
  ✅ mTLS 自動化(証明書管理不要)
  ✅ Circuit Breaker / Timeout / Retry ポリシー
  ✅ トラフィックシェイピング(Canary 対応)
  ✅ ロギング・メトリクス統合
  
料金:
  ✅ 追加費用なし(Service Discovery のみ)

3. ECS Managed Instances

EC2 インスタンス管理を AWS が一部サポート(2024-2025)。

  • 機能:
  • ✅ OS パッチ管理自動化
  • ✅ キャパシティプランニング支援
  • ✅ コスト最適化提案

4. Fargate Spot 拡張

より多くのリージョン / AZ で利用可能(2026 年拡大予定)。

  • 割引:最大 70%
  • 用途:バッチ処理・開発環境・一時的なワークロード

5. AI / ML ワークロード加速

Inferentia2 / Trainium チップ対応 EC2 インスタンス。

  • 用途:
  • ✅ 機械学習推論(低遅延・コスト最適)
  • ✅ 大規模言語モデル訓練
  • ✅ Hugging Face Model Hub 統合

6. Container Insights 深化

トレース・プロファイリング統合(2026)。

  • 機能:
  • ✅ Application Signals(X-Ray 統合)
  • ✅ CloudWatch ServiceLens で依存関係可視化
  • ✅ 自動的なパフォーマンス異常検知

7. ECS Anywhere での Hybrid 運用

オンプレミス・エッジサーバーを ECS で統合管理。


学習リソース

公式ドキュメント

学習パス

  1. 初級: ECS 基本概念(Cluster / Task / Service)
  2. 中級: Fargate デプロイ、Auto Scaling、ロードバランシング
  3. 上級: Service Connect、Blue/Green デプロイ、Capacity Providers
  4. エキスパート: ECS Anywhere、Kubernetes 統合、高度なセキュリティ

実装例・活用シーン

シーン 1: 新規 Web API(推奨構成)

ALB → ECS Service (Fargate, Desired=3)
  ├─ Auto Scaling: CPU 70%
  ├─ Blue/Green デプロイ (CodeDeploy)
  ├─ CloudWatch Logs
  └─ IAM Task Role: S3 / DynamoDB アクセス

月額: ~$240(Fargate 0.5 vCPU / 1 GB × 3 + ALB)

シーン 2: マイクロサービス

Service A → Service Connect (servicea.local)
Service B → Service Connect (serviceb.local)
Service C → Service Connect (servicec.local)
  ├─ 各サービス独立スケーリング
  ├─ 自動サービスディスカバリー
  └─ Capacity Provider で ON/Spot 混合

月額: ~$500(3 サービス × $240 - 割引)

シーン 3: バッチ処理

CloudWatch Events (cron)
  → ECS RunTask (Fargate Spot)
  → S3 データ処理
  → RDS / DynamoDB 更新

月額: 実行時間のみ(例: 1h/日 × $0.04 ≈ $1.2)

導入ロードマップ

フェーズ 1: 評価(1-2 週間)

  • [ ] ECS / Fargate コンセプト理解
  • [ ] 既存アプリを Docker 化
  • [ ] ECR にイメージプッシュ

フェーズ 2: POC(2-4 週間)

  • [ ] ECS クラスター作成(Copilot / Terraform)
  • [ ] Fargate 上でアプリ実行
  • [ ] CloudWatch Logs 確認

フェーズ 3: 本番化(4-8 週間)

  • [ ] ALB / NLB 統合
  • [ ] Auto Scaling 設定
  • [ ] Blue/Green デプロイ設定
  • [ ] セキュリティ(IAM / Secrets)

フェーズ 4: 最適化(継続)

  • [ ] Capacity Providers(ON/Spot)
  • [ ] Service Connect 導入
  • [ ] コスト削減(Fargate Spot / Graviton)

実装チェックリスト

デプロイ前チェック:

  • ✅ Docker イメージは ECR にプッシュ済みか
  • ✅ タスク定義は環境変数 / シークレットで分離されているか
  • ✅ ヘルスチェック (HTTP / TCP / CMD-SHELL) が設定されているか
  • ✅ Execution Role は ecr:BatchGetImage / logs:PutLogEvents 権限を持つか
  • ✅ Task Role は必要最小限の権限か
  • ✅ ロギングは CloudWatch Logs 設定済みか
  • ✅ Fargate の場合、ネットワークモードは awsvpc か
  • ✅ Auto Scaling ポリシーは設定済みか(CPU / メモリ)
  • ✅ ALB ターゲットグループ健全性チェック設定済みか
  • ✅ Deployment Circuit Breaker は有効か
  • ✅ CloudWatch Container Insights は有効か

デプロイ後チェック:

  • ✅ タスクは RUNNING ステータスか
  • ✅ ALB でエンドポイント応答するか(200 OK)
  • ✅ CloudWatch Logs にログが流れているか
  • ✅ Auto Scaling アラーム設定済みか
  • ✅ バックアップ / ディザスタリカバリー計画はあるか

まとめ

Amazon ECS は、AWS ネイティブのフルマネージドコンテナオーケストレーションサービス です。

要点

  1. 簡単: Kubernetes より学習コスト低い、AWS 統合深い
  2. 柔軟: EC2 / Fargate / ECS Anywhere で複数起動タイプ対応
  3. 安全: Blue/Green デプロイ、自動ロールバック、IAM Task Role
  4. スケーラブル: Auto Scaling、Capacity Providers で多次元最適化
  5. コスト効率: Fargate Spot(70% 割引)、Graviton(20% 削減)

いつ ECS を選ぶか

✅ AWS 専業の本番環境 ✅ 新規コンテナアプリ ✅ Kubernetes の学習コストが許容できない ✅ AWS ネイティブ統合が重要

❌ マルチクラウド / ポータビリティ重視 → EKS ❌ イベント駆動 / 短時間処理 → Lambda ❌ より高い抽象化が必要 → App Runner

次のステップ

  1. Copilot CLI / Terraform で実装
  2. 小規模 POC 実施(テストアプリ)
  3. Production 環境への段階的移行
  4. Service Connect / Capacity Providers による最適化

参考文献

公式ドキュメント・ガイド

  1. AWS ECS Documentation - 最新仕様・API リファレンス
  2. ECS Best Practices
  3. ECS Service Connect Guide - サービスディスカバリー
  4. AWS ECS Workshop - ハンズオン実習
  5. ECS Pricing - 料金詳細・コスト計算

デプロイツール・CLI

  1. AWS Copilot CLI - モダンコンテナデプロイツール
  2. AWS Copilot Documentation
  3. ECS Container Agent - GitHub オープンソース

Infrastructure as Code

  1. Terraform AWS ECS
  2. AWS CDK ECS Module
  3. Pulumi ECS
  4. Docker Compose X - Docker Compose → CloudFormation

関連 AWS サービス

  1. ECR (Elastic Container Registry) - コンテナイメージレジストリ
  2. ALB / NLB - ロードバランシング
  3. CloudWatch Container Insights
  4. AWS CodeDeploy - Blue/Green デプロイ
  5. AWS CodePipeline - CI/CD パイプライン
  6. AWS Secrets Manager
  7. AWS CloudTrail - 監査ログ

ブログ・リソース

  1. AWS Containers Blog - 最新ニュース・ベストプラクティス
  2. 「ECS の基本からベストプラクティスまで」AWS Black Belt 動画
  3. 「Fargate vs EC2: 使い分けガイド」AWS ブログ
  4. 「マイクロサービスと ECS」クラウドネイティブの実装パターン


最終更新:2026-04-26 バージョン:v2.3(Express Mode・Service Connect GA 対応) 対象: ECS 2026 年最新仕様、Express Mode、Fargate Spot、Service Connect GA、Managed Instances、AI/ML ワークロード加速 著者:Claude (Anthropic) — i のメモ拡充プロジェクト