AWS ECS VISUALIZER

AWS ECS

Dockerコンテナのデプロイ・管理・スケーリングを行うコンテナオーケストレーションサービス

シナリオ
ECRにイメージ登録 → タスク定義 → サービス作成 → ALBで公開するまでの全フロー
ステップ1 / 10
ステップ
ECS デプロイの全体像
DockerコンテナのWebアプリをAWS ECSでデプロイし、ALB(Application Load Balancer)でインターネットに公開するまでの全フローです。ECR → タスク定義 → サービス → タスク → コンテナという階層構造で、ALBがユーザーからのリクエストをコンテナに振り分けます。
ARCHITECTURE DIAGRAM
ECR → タスク定義 → ECSサービス → タスク起動(基本フロー)
STEP 1
CODE VIEW
── シナリオ: WebアプリをECSでデプロイする ──
 
このシナリオでは、Dockerコンテナの
WebアプリをECSでデプロイし、ALBで
インターネットに公開するまでの全フローを
ステップごとに見ていきます。
 
フロー:
📦 ECR(イメージ保管)
↓ イメージ指定
📋 タスク定義(設計図)
↓ 設定を渡す
⚙️ ECSサービス(タスク管理)
↓ タスク起動
🔲 タスク → コンテナ(Webアプリ)
↑ ALB がトラフィック振り分け
👤 ユーザー → ALB → コンテナ
ECR
タスク定義
ECSサービス
タスク
解説

📦
ECS とは

アプリを動かすとき、「コンテナ」という仕組みを使うと、アプリに必要なものをすべて1つの箱に詰め込んで、どこでも同じように動かせます。自分のパソコンでも、クラウドでも、まったく同じ箱を使うので「自分の環境では動いたのに...」という問題がなくなります。

しかし、この箱(コンテナ)を本番環境で安定して動かし続けるのは大変です。箱が壊れたら新しい箱を起動し、アクセスが増えたら箱を増やし、古い箱を新しい箱に入れ替える...。こうした「コンテナの運用管理」を自動でやってくれるのがコンテナオーケストレーションです。

Amazon ECS(Elastic Container Service)は、AWSが提供するコンテナオーケストレーションサービスです。下の図のように、コンテナイメージ(箱の設計図)をECRに保管し、タスク定義で実行条件を決め、サービスが常にコンテナを動かし続けます。

DockerImageAmazonECSContainer 1Container 2Container 3
ECSの主な機能:
- コンテナの自動起動・停止・再起動
- ヘルスチェックによる異常検知と自動復旧
- ロードバランサー(ALB)と連携したトラフィック分散
- Auto Scalingによるコンテナ数の自動調整
- ローリングアップデートによるダウンタイムゼロのデプロイ

ECS の特徴

ECSはAWSの他のサービスと深く統合されており、コンテナを使ったWebアプリの構築から運用まで、AWSのエコシステムの中でシームレスに行えます。以下が主な特徴です。

ECRイメージ保管ECSコンテナ実行ALB負荷分散ECRにイメージ保管 → ECSでコンテナ実行 → ALBでトラフィック分散
フルマネージド: コントロールプレーン(コンテナの管理基盤)はAWSが運用します。ユーザーはサーバーのパッチ適用や冗長化を気にする必要がありません。
Fargate対応: サーバーレスでコンテナを実行できます。EC2インスタンスを管理する必要がなく、コンテナの定義だけで本番運用が可能です。
ALB統合: Application Load Balancerと連携し、複数のコンテナにリクエストを自動分散します。ヘルスチェックで異常なコンテナを自動的に切り離します。
Auto Scaling: CPUやメモリの使用率に応じて、コンテナの数を自動で増減します。アクセスが増えたらスケールアウトし、減ったらスケールインしてコストを最適化します。

📝
タスク定義とは

タスク定義(Task Definition)は、コンテナを動かすための「レシピ(設計図)」です。料理のレシピに「材料」「分量」「手順」が書かれているように、タスク定義には以下の情報が書かれています。

- CPU / メモリ: コンテナに割り当てるコンピューティングリソースの量
- ポートマッピング: 外部からのアクセスをコンテナのどのポートに繋ぐか
- 環境変数: データベースの接続先やAPIキーなどの設定値
- ログ設定: ログの出力先(CloudWatch Logs等)

Task Definition: my-web-app:3image123456.dkr.ecr.../my-app:v1cpu256 (0.25 vCPU)memory512 MBport8080
// タスク定義の JSON 例
{
"family": "my-web-app",
"cpu": "256", // 0.25 vCPU
"memory": "512", // 512 MB
"networkMode": "awsvpc",
"containerDefinitions": [{
"name": "web",
"image": "123456.dkr.ecr...amazonaws.com/my-app:v1",
"portMappings": [{ "containerPort": 8080 }],
"logConfiguration": {
"logDriver": "awslogs"
}
}]
}
バージョニング: タスク定義は自動でバージョン管理されます。my-web-app:1my-web-app:2のようにリビジョン番号が振られ、新バージョンをデプロイするときはリビジョンを上げてサービスを更新します。問題があれば古いリビジョンにロールバックも可能です。

⚙️
ECS サービス — タスクを「常に動かし続ける」マネージャー

レストランに例えると、サービスはフロアマネージャーです。「テーブルには常に3皿出ている状態を維持して」という指示(desired count)に従い、料理(タスク)が片付けられたら新しく作り直します。

サービスはWebアプリのように「常に動いていてほしい」ワークロードのための仕組みです。タスクが異常終了しても自動で新しいタスクを起動して数を維持します。バッチ処理のように「1回実行して終わり」のワークロードにはサービスは不要で、タスクを直接起動します。

Servicedesired: 3常に3個維持落ちたら再起動Task 1RUNNINGTask 2RUNNINGTask 3✕ 異常終了Task 3'自動復旧!Task 3 が落ちても → サービスが自動で Task 3' を起動して数を維持
desired count(希望タスク数)

「常にN個のタスクを動かしたい」という数値。サービスはこの数を維持するために、タスクの起動・終了を自動管理します。Auto Scaling と連携すればアクセス量に応じて自動で増減もできます。

ローリングアップデート

新バージョンをデプロイするとき、古いタスクを1つずつ新しいタスクに入れ替えます。常にヘルシーなタスクが残っているのでダウンタイムゼロでリリースできます。

Blue/Green デプロイ

CodeDeploy と連携して使います。まず新バージョンのタスク(Green)を別に起動し、ヘルスチェックが通ったらトラフィックを旧バージョン(Blue)から Green に切り替えます。切り替え後に問題が見つかった場合は、Blue がまだ残っているので即座にロールバックできます。ローリングアップデートより安全なため、本番環境ではこちらが推奨されます。

🔲
タスク — コンテナの「実行環境」

タスクはコンテナが実際に動く「箱」です。タスク定義(設計図)を元にサービスが起動し、中で1つ以上のコンテナが実行されます。

Fargate 起動タイプの場合、各タスクには専用の ENI(ネットワークインターフェース)が割り当てられ、プライベート IP アドレスを持ちます。CPU・メモリもタスク単位で確保されるため、他のタスクの影響を受けません。

Task (Fargate)🐳 Container: webimage: my-web-app:v1port: 3000 | RUNNINGリソースENI: 10.0.1.10 (専用IP)CPU: 256 (.25vCPU) | Mem: 512MBタスク = コンテナ + ENI + CPU/メモリの実行環境
タスク vs コンテナ

タスクとコンテナは別物です。タスクは「実行環境」でENI・CPU・メモリを提供し、その中でコンテナが動きます。1つのタスクに複数のコンテナを入れることも可能です(例: Webアプリ + サイドカーログ収集)。

awsvpc ネットワークモード

Fargate ではタスクごとに専用の ENI(ネットワークインターフェース)が付与されます。各タスクが固有の IP を持つため、セキュリティグループをタスク単位で設定でき、他のタスクと完全に分離されます。

タスクのライフサイクル

PROVISIONING(リソース確保中)→ PENDING(起動待ち)→ RUNNING(稼働中)→ STOPPED(停止)。サービスが管理するタスクは STOPPED になると自動で新しいタスクが起動されます。

⚖️
Fargate vs EC2 — 起動タイプの選び方

ECS でコンテナを動かすとき、「誰がサーバーを管理するか」を選べます。これが「起動タイプ」です。

Fargate は「サーバーのことは AWS に任せて、コンテナだけに集中したい」モードです。サーバーの購入・セットアップ・パッチ適用・スケーリングをすべて AWS がやってくれます。マンションの賃貸のようなもので、管理は大家さん(AWS)任せです。

EC2 は「サーバーを自分で管理する代わりに、自由にカスタマイズしたい」モードです。一戸建てを買うようなもので、修繕も自分でやるけど壁に穴を開けるのも自由です。

✓ Fargate(サーバーレス)AWS が自動管理Task A🐳 ContainerENI: 10.0.1.10Task B🐳 ContainerENI: 10.0.1.11EC2(自己管理)EC2 Instance (自分で管理)Task C🐳 Containerbridge modeTask D🐳 Containerbridge modeタスクごとに専用 ENIパッチ適用・スケーリング不要EC2 の IP を共有OS 設定・GPU 利用が可能Fargate = 賃貸マンション(管理は大家任せ) / EC2 = 一戸建て(自分で管理、自由にカスタマイズ)
比較項目FargateEC2
サーバー管理ほぼゼロ(サーバーレス)EC2 の運用・パッチ適用が必要
ネットワークawsvpc(タスクごとに専用 ENI)bridge / awsvpc / host 選択可
コストやや高い(リソース単価)大規模なら安い(RI / Spot 利用可)
コスト削減策FARGATE_SPOT(最大70%割引)Spot Instance / RI / Savings Plans
カスタマイズ制限あり(OS 設定不可)自由(カーネル / ストレージ設定可)
GPU非対応GPU インスタンス利用可能
スケール速度速い(数十秒)EC2 起動を含むため遅い
セキュリティタスク分離が強い(専用 ENI)EC2 内で複数タスクが同居可能
Fargate を選ぶべきケース

ほとんどの Web アプリ・API サーバー・マイクロサービスは Fargate で十分です。サーバー管理が不要なのでチームがアプリ開発に集中でき、スケーリングも数十秒で完了します。迷ったら Fargate から始めましょう。

EC2 を選ぶべきケース

GPU が必要(機械学習推論など)、大規模でコスト最適化が重要(数百タスク以上で RI / Spot を活用)、OS レベルのカスタマイズが必要(カーネルパラメータ変更など)な場合に EC2 を選びます。

FARGATE_SPOT でコスト削減

Fargate のコストが気になる場合、FARGATE_SPOT を使うと最大 70% 割引になります。ただし AWS の都合でタスクが中断される可能性があるため、中断に耐えられるワークロード(バッチ処理、開発環境など)に向いています。

📝
SAA 試験レベルの問題

Q1.ECSでWebアプリを常時稼働させたい場合、タスクを直接実行(run-task)するのとサービスを使うのではどちらが適切ですか?
A.run-taskで定期的にタスクを手動起動する
B.サービスを作成してdesired countを設定する
C.CloudWatch EventsでLambdaを使ってタスクを監視する
D.EC2インスタンスに直接Dockerをインストールして運用する
Q2.Fargate起動タイプのECSタスクをプライベートサブネットで実行しています。ECRからコンテナイメージをpullするために必要なものはどれですか?
A.Internet Gatewayをサブネットに追加する
B.NAT GatewayまたはECR用VPCエンドポイントを設定する
C.タスクにElastic IPを割り当てる
D.ECRをパブリックリポジトリに変更する
Q3.ECSのタスク定義で指定する「タスク実行ロール」と「タスクロール」の違いとして正しいものはどれですか?
A.両方ともコンテナ内のアプリケーションが使うロールである
B.タスク実行ロールはECSエージェントが使い、タスクロールはコンテナ内アプリが使う
C.タスク実行ロールはFargate専用、タスクロールはEC2専用である
D.タスクロールはECRからのイメージpullに必要なロールである

関連コンテンツ