ECSとは?
完全に管理されたコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケールが可能となる。
コンテナオーケストレータは各サーバーのCPUやメモリといったリソースの利用可能量の監視や、各コンテナの利用状況による負荷状態を監視して必要なコンテナ数やどこにコンテナを配置するのかを判断し実行してくれる→リソースを管理してコンテナ配置を適正化するもの
コンテナの追加削除はもちろんのこと、コンテナの状態も監視しているため、コンテナが停止した場合に新たなコンテナを用意し、停止したコンテナを破棄したりもできる。
要は複数のコンテナを管理する環境で、各コンテナやホストマシンの状況を監視して適切に配置してくれる便利なツールである(フルマネージドなのでホストやオーケストレータのリソース管理はAWS側が管理してくれる)
ECSの基本構造
ECSは下記を内包している。(->の先が内包されているものとなり)
クラスタ->サービス->タスク(ECSの中で最小のデプロイ単位)->コンテナ
それぞれ下位は複数内包できる。
タスクはタスク定義(json)によって定義されており、記載されている記述に従ってタスクが起動されることになる。タスクはクラスターの中にいなければならないが、必ずしもサービスの中にいる必要はない。
ECR
コンテナイメージを格納しておく場所。タスクはECRからイメージをダウンロードし、コンテナを起動する(ECSとは別サービス)
コンテナイメージを格納、管理、デプロイするためのAWSサービスであり、コンテナイメージレジストリの1種
Task
タスクはECSの最小粒度のデプロイ単位である。ECSはコンテナを直接操作するのではなくコンテナの追加や削除が必要な場合はタスク単位で操作を行う
タスク内にコンテナが2つ存在する場合は、2つを最小単位として、追加や削除を行うことになる。サービスの中にタスクは存在するが、直接クラスターの中にも配置可能である。
Task定義
jsonで記載されたタスクの設計図となる定義である。どのようなコンテナをタスクの中に作成するのか、各コンテナに必要なCPUやメモリのリソース、環境変数やログ設定などを記述する
Service
タスクの状態・個数を理想の状態に維持する役割を持つ
タスクの維持管理、スケーリング、負荷分散(ロードバランサと連携)、アップデートとデプロイなど
Cluster
タスクとサービスの集合体であり、ECSの概念の中で一番外側に位置するものである。
ECSのアプリケーション実行環境
EC2
高い柔軟性とコスト最適を図れるが、OSなどの管理コストがかかる
Fargateよりも安く、リザーブドインスタンス(長期で使用予定のインスタンスを予約することで通常より安く利用可能となる)が使用可能な反面、管理コストはかかる。スケーリングの際はEC2を用意する必要がある(オートスケールで回避可能かも)
Fargate
サーバーレスでOSなどの管理が不要であり、シンプルで簡単に始めやすい反面、柔軟性は低くなる
Fargateではタスクに必要なCPUとメモリ指定を行うだけで、リソース管理はAWS側で行ってくれる。スケーリングの際のコンテナ環境の用意も意識せずに済む
それぞれのユースケース
EC2
- OSやネットワークの細かいチューニングが必要
- 超大規模サーバ管理で工数以上にAWSコスト削減のメリットが大きい(少し安いからね)
- GPUを使用する必要がある(サポートされてない)
Fargate
- OSやネットワークのチューニング要件がない
- サーバー管理をしたくない。または工数をかけにくい