Amazon ECS
Docker コンテナのデプロイ、管理、スケーリングを行うフルマネージドなコンテナオーケストレーションサービスで、Fargate と EC2 の 2 つの起動タイプを提供する
概要
Amazon Elastic Container Service (ECS) は、Docker コンテナを大規模に実行・管理するためのフルマネージドなコンテナオーケストレーションサービスです。タスク定義でコンテナイメージ、CPU/メモリ要件、ネットワーク設定、ログ設定などを宣言的に定義し、サービスとしてデプロイすることで、指定した数のタスクが常に実行されるよう自動管理されます。Fargate 起動タイプではインフラ管理が不要で、EC2 起動タイプではインスタンスの詳細な制御が可能です。ALB や NLB との統合によるトラフィック分散、Auto Scaling によるタスク数の自動調整、ECR (Elastic Container Registry) からのコンテナイメージの取得、CloudWatch によるモニタリングとログ管理など、コンテナ運用に必要な機能が統合されています。ECS Exec を使えば、実行中のコンテナに直接接続してデバッグすることも可能です。
タスク定義とサイドカーパターン
ECS のタスク定義は、1 つ以上のコンテナの実行方法を定義する JSON テンプレートです。各コンテナにはイメージ URI、CPU/メモリの割り当て、ポートマッピング、環境変数、ログドライバー、ヘルスチェックなどを設定します。サイドカーパターンを使えば、メインのアプリケーションコンテナに加えて、ログ収集 (Fluent Bit)、プロキシ (Envoy)、モニタリングエージェントなどの補助コンテナを同一タスク内で実行できます。ECS サービスはタスク定義に基づいて指定数のタスクを維持し、タスクが異常終了した場合は自動的に新しいタスクを起動します。ECS 自体のオーケストレーション料金は無料で、Fargate または EC2 のリソース料金のみが発生する点は、内部的に Kubernetes を使用する Azure Container Apps のような vCPU/メモリ秒課金のサービスと比べてコスト構造が明快です。
Fargate と EC2 起動タイプの使い分け
ECS の大きな特徴は、Fargate と EC2 の 2 つの起動タイプを同一クラスター内で柔軟に切り替えられる点です。Fargate 起動タイプではインフラ管理が不要で、タスクごとに隔離されたコンピューティング環境が自動的にプロビジョニングされます。OS パッチ適用やキャパシティプランニングから解放されるため、運用負荷を最小化したいチームに適しています。一方、EC2 起動タイプではインスタンスタイプの選定や GPU の利用、カスタム AMI の適用など、インフラレベルの詳細な制御が可能です。実務では、Web API のような標準的なワークロードは Fargate で運用し、GPU を必要とする推論処理だけ EC2 起動タイプに切り替えるハイブリッド構成が効果的です。コンテナ運用の技術書 (Amazon) では、起動タイプの選定基準がさらに詳しく解説されています。
デプロイ戦略とスケーリング
ECS はローリングアップデート、Blue/Green デプロイメント (CodeDeploy 統合) の 2 つのデプロイ戦略を提供します。ローリングアップデートは新しいバージョンのタスクを段階的に起動し、古いタスクを順次停止する方式で、追加リソースのコストを抑えつつダウンタイムなしで更新できます。Blue/Green デプロイは新旧 2 つのタスクセットを並行稼働させ、ALB のリスナールールでトラフィックを段階的に切り替える方式で、問題発生時の即座なロールバックが可能です。スケーリングではターゲット追跡スケーリングが一般的で、CPU 使用率 70% を目標に設定してタスク数を自動調整します。Container Insights で CPU/メモリの実使用率を継続的にモニタリングし、タスク定義のリソース割り当てを最適化することがコスト削減の鍵です。サービスディスカバリには Cloud Map を使用し、マイクロサービス間の通信を DNS ベースで解決します。