ECS とは
AWS が提供するマネージドのコンテナオーケストレーションサービスです。Docker Compose のクラウド版みたいなものです。
ECS の各要素
クラスタ
複数のサーバー群をひとまとめにしてひとつのコンテナ実行環境とみなしたものです。後述するタスク・サービスはこのクラスタ上に展開されます。
クラスタのリソースには EC2 インスタンスを使うことができます。
サービス
サービスはタスクの実行を管理するリソースです。タスクをクラスタ上に展開し維持するための様々な役割を持っています。
サービスの仕事:
- タスクのデプロイと維持
- タスクのロードバランサへの紐付け・切り離し
- タスクのヘルスチェック
- ローリングアップデート時の制御
タスクを EC2 インスタンス上に展開する他に Fargate で展開することもできます。タスクを EC2 で実行するか Fargate で実行するかはサービスの設定で選択できます。
タスク
タスクはコンテナの実行単位です。クラスタ上で実際に実行されるものがこれです。
タスクはタスク定義を元に生成されます。タスク定義というのは Docker Compose における compose.yaml のようなものです。記法や機能差はありますが compose.yaml で定義できることはタスク定義でもだいたいできると印象を持ってよいでしょう。サービス作成時にあらかじめタスク定義を作成しておく必要があります。
一つのタスクに複数のコンテナを含めることができますがライフサイクルはタスク単位になります。
ECS ではウェブサーバーのように永続的なタスクを実行することが多いと思いますが、このようなタスクの実行は一般的にサービスが管理します。
一方タスクはサービスを使わずに直接実行することもでき、ワンショットのタスクは直接実行します。
ECS サービスの仕事
タスクのデプロイと維持
サービスはタスク定義に記述されているタスクを要求タスク数だけ立ち上げます。
また実行中のタスクが何らかの理由で終了したときなど、実行中のタスク数が要求タスク数に満たなくなった際にもタスクを立ち上げます。
ロードバランサーへの紐づけ
サービスの設定では起動したタスクをロードバランサに結びつける設定を記述できます。タスクの健康状態に問題が発生したときにはロードバランサ (ターゲットグループ) から切り離されます。
ローリングアップデート
タスク定義を更新しサービスのアップデートを行う場合ローリングアップデートが行われます。新旧のタスクの合計が desiredCount に対して minimunHealthyPercent と maximumPercent を超えない範囲でタスクを増減させつつ、全体が新しいタスクになるように置き換えていきます。
ECS サービスはローリングアップデート以外に CodeDeploy による Blue/Green にも対応しています。