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との使い分け
| 観点 | Lambda | ECS(Fargate) | EC2 |
|---|---|---|---|
| 運用負荷 | ◎ | ○ | △ |
| 実行時間 | 制限あり | 制限なし | 制限なし |
| サーバ管理 | 不要 | 不要 | 必要 |
| 自由度 | 中 | 高 | 最大 |
Lambdaが向いている
- イベント駆動
- 短時間処理
- サーバ管理したくない
ECSが向いている
- 常時稼働
- コンテナ前提
- 長時間処理
EC2が向いている
- OSレベル制御が必要
- 特殊な要件(GPUなど)
- コスト最適化を追求したい
Fargate vs EC2起動タイプ
Fargate
サーバレスでコンテナ実行
特徴
- サーバ管理不要
- すぐ使える
- やや割高
EC2起動タイプ
自分でサーバを管理
特徴
- 柔軟性が高い
- コスト最適化可能
- 運用負荷あり
まとめ
- クラスタ:場所
- サービス:管理
- タスク:実行
- タスク実行ロール:ECSが使う
- タスクロール:アプリが使う
ECSは「コンテナをどう動かすか」を管理するサービス
おわりに
ECSは一見シンプルですが、
- 概念の分離(クラスタ / サービス / タスク)
- ロールの違い
- 起動タイプの選択
あたりで毎回つまずきやすいです。
この記事が、「あれなんだっけ?」を解消するリファレンスになれば嬉しいです。
