ECS入門:クラスタ・サービス・タスクの違いから、他サービスとの使い分けまで一気に理解する

はじめに

どうも、Cloud & Dataplatformチームの國嶋です。

業務でECSを触るたびに、

  • 「クラスタとサービスの違いってなんだっけ?」
  • 「タスクってサービスに必須だっけ?」
  • 「タスクロールとタスク実行ロールってどっちがどっちだっけ?」

と、毎回うっすら分かっているのに思い出し直す…という状態になりがちでした。

その場では理解したつもりでも、時間が経つとまた曖昧になる。
同じところで何度も引っかかるのが地味にストレスだったので、今回あらためて整理することにしました。

この記事では、

  • ECSの基本概念(クラスタ / サービス / タスク)
  • タスクロールとタスク実行ロールの違い
  • ECSを使うべき場面と他サービスとの使い分け

を、「あとから見返しても迷わない」ことを意識してまとめています。

同じように「毎回なんとなく分かるけど説明はできない」という状態の人の助けになれば嬉しいです。


ECSとは何か

ECS(Elastic Container Service)は、

コンテナを実行・管理するためのAWSのマネージドサービス

です。

やってくれることは主に以下です:

  • コンテナの起動・停止
  • 配置(どのサーバで動かすか)
  • ヘルスチェック
  • スケーリング

ECSの全体像

ECSには主に以下の要素があります:

ECSクラスタ
├─ ECSサービス
│ ├─ タスク
│ ├─ タスク
│ └─ タスク
└─ 単発タスク

ECSクラスタ / サービス / タスクの違い

ECSクラスタとは

タスクを実行するための「場所(論理的な枠)」

  • コンテナを動かすためのグループ
  • 実際のサーバ(EC2 or Fargate)を内包

ポイント

  • クラスタ自体は何も実行しない
  • あくまで「どこで動かすか」の指定

タスクとは

コンテナの実行単位(実体)

  • タスク定義を元に起動される
  • 1つ以上のコンテナを含む

特徴

  • 単発実行が可能
  • 終わったら停止する
  • 自動復旧はしない(サービス配下でない場合)

サービスとは

タスクを継続的に管理する仕組み

やってくれること

  • 指定した数のタスクを維持(desired count)
  • タスクが落ちたら再起動
  • オートスケーリング
  • ALBとの連携

違いまとめ

概念役割具体例
クラスタ実行場所prod環境
サービス維持管理Webサーバ
タスク実行単位APIコンテナ

タスクはサービスなしでも動く

ここはよく混乱するポイントです。

なぜサービスが必須ではないのか?

タスクは「実行」そのものだから

例:バッチ処理

  • CSVを処理
  • DB更新
  • 終わったら終了

→ 再起動されると困る

👉 サービスは不要


なぜ1タスクに複数コンテナを入れられるのか

「必ず一緒に動いてほしいもの」をまとめるため


例:ログ転送

[ タスク ]
├─ appコンテナ
└─ logコンテナ(Fluent Bit)
  • appがログ出す
  • logコンテナが転送
  • app停止 → logも停止

👉 セットで動かす必要がある


例:プロキシ(サイドカー)

[ タスク ]
├─ app
└─ proxy(Envoy)

👉 単体では意味を持たないため一体化


IAMロール:タスクロールとタスク実行ロール

ここはECSの中でも特につまずきやすいポイントです。

名前が似ているため混乱しがちですが、実は考え方はとてもシンプルです。


結論

ロール使う主体目的
タスク実行ロールECS(裏側)タスク起動のため
タスクロールアプリAWSリソースアクセス

まずは覚え方から押さえておくと、このあとが一気に理解しやすくなります。


覚え方(これだけで迷わなくなる)

この2つは「誰が使うか」「タイミング」で覚えるのが一番分かりやすいです。


覚え方①:「実行するのは誰?」

  • タスク実行ロール(Execution role)
    → タスクを「実行する」のは ECS
    ECSが使うロール
  • タスクロール(Task role)
    → タスクの中で動くのはアプリ
    アプリが使うロール

覚え方②:「タイミングで分ける」

タイミングロール
タスク起動時タスク実行ロール
タスク実行中タスクロール

覚え方③:「外側 vs 内側」

[ ECS(外側) ] → タスク実行ロール

[ コンテナ(内側) ] → タスクロール
  • 外側(インフラ側) → 実行ロール
  • 内側(アプリ側) → タスクロール

タスク実行ロール

ECSがタスクを起動するために使うロール

  • ECRからイメージをpull
  • CloudWatch Logsへログ出力

タスクロール

タスク内のアプリが使うロール

  • S3にアクセス
  • DynamoDB更新
  • SQS送信

よくあるミス

  • タスク実行ロールに必要以上の権限を付けてしまう
  • タスクロールを設定し忘れる

👉 「誰が使うか」で切り分けると防げます


一言でまとめると

タスク実行ロールはECS用、タスクロールはアプリ用


ECSはいつ使うのか


ECSが向いているケース

  • Webアプリ / API
  • コンテナ化されたバッチ
  • 言語・環境が混在
  • Docker前提の開発

EC2 / Lambdaとの使い分け

観点LambdaECS(Fargate)EC2
運用負荷
実行時間制限あり制限なし制限なし
サーバ管理不要不要必要
自由度最大

Lambdaが向いている

  • イベント駆動
  • 短時間処理
  • サーバ管理したくない

ECSが向いている

  • 常時稼働
  • コンテナ前提
  • 長時間処理

EC2が向いている

  • OSレベル制御が必要
  • 特殊な要件(GPUなど)
  • コスト最適化を追求したい

Fargate vs EC2起動タイプ


Fargate

サーバレスでコンテナ実行

特徴

  • サーバ管理不要
  • すぐ使える
  • やや割高

EC2起動タイプ

自分でサーバを管理

特徴

  • 柔軟性が高い
  • コスト最適化可能
  • 運用負荷あり

まとめ

  • クラスタ:場所
  • サービス:管理
  • タスク:実行
  • タスク実行ロール:ECSが使う
  • タスクロール:アプリが使う

ECSは「コンテナをどう動かすか」を管理するサービス


おわりに

ECSは一見シンプルですが、

  • 概念の分離(クラスタ / サービス / タスク)
  • ロールの違い
  • 起動タイプの選択

あたりで毎回つまずきやすいです。

この記事が、「あれなんだっけ?」を解消するリファレンスになれば嬉しいです。

新規CTA