AWSでDockerコンテナを動かそうとすると、ECS・Fargate・ALBというサービス・用語がよく登場します。
最初に調べたとき、
- ECSとFargateは何が違うのか
- Fargateは仮想サーバーなのか
- ALBは何をしているのか
- Dockerコンテナは結局どこで動いているのか
と、それぞれの役割が分かりづらかったので整理します。
この記事では、Spring BootアプリをDockerコンテナとしてAWS上で動かすケースを例に説明します。
全体像
まず、ざっくりとした構成を見てみます。
ユーザー
|
| HTTP / HTTPS
v
+-------------------+
| ALB |
| Application |
| Load Balancer |
+-------------------+
|
v
+-------------------+
| ECS Service |
+-------------------+
|
v
+-------------------+
| Fargate Task |
| |
| +---------------+ |
| | Docker | |
| | Spring Boot | |
| +---------------+ |
+-------------------+
かなり単純化すると、それぞれ次の役割を持っています。
| 名前 | 主な役割 |
|---|---|
| ECS | コンテナを管理する |
| Fargate | コンテナを実行するためのコンピューティング環境を提供する |
| ALB | HTTP/HTTPSリクエストを適切なターゲットへ振り分ける |
この3つは似たサービスではなく、それぞれ担当している仕事が違います。
ECSとは
ECSは Amazon Elastic Container Service の略です。
Dockerなどのコンテナ化されたアプリケーションをAWS上で管理・実行するためのコンテナオーケストレーションサービスです。
例えば、
Spring Boot
↓
Dockerイメージ
↓
AWS上でコンテナとして実行
という構成を作る場合、ECSを使ってコンテナを管理できます。
ただし、
ECSそのものが仮想サーバーとしてコンテナを動かしている
というわけではありません。
ECSは、どちらかというとコンテナを管理する側です。
ECSのTaskとは
ECSを理解するときに重要なのがTaskです。
Taskは、Task Definition(タスク定義)をもとに実際に起動されたコンテナ群です。
例えばタスク定義で、
使用するDockerイメージ
CPU
メモリ
ポート
環境変数
ログ設定
などを指定します。
そして、その設定をもとに実際に起動したものがTaskです。
イメージとしては、
Task Definition
「この設定でコンテナを動かしてください」
|
v
Task
「実際に動いているコンテナ」
と考えると分かりやすいです。
ECS Serviceとは
Webアプリでは、Taskを1回起動して終わりでは困ります。
例えばSpring BootアプリのTaskが何らかの理由で停止した場合、そのままWebアプリにアクセスできなくなってしまいます。
そこで使われるのがECS Serviceです。
Serviceでは、
Taskを常に2個動かす
といったDesired Count(必要なTask数)を設定できます。
例えば、
Desired Count = 2
の場合、
Task A ← 稼働中
Task B ← 稼働中
という状態を維持します。
Task Aが停止すると、ECS Serviceが新しいTaskを起動して、設定されたTask数を維持しようとします。
つまり、
Task = 実際に動くコンテナ
Service = 必要なTask数を維持する仕組み
という違いがあります。
Fargateとは
Fargateは、ECSなどでコンテナを実行するときに利用できるサーバーレスなコンピューティング環境です。
ECSでコンテナを動かす方法には、大きく分けて、
ECS + EC2
と
ECS + Fargate
があります。
ECS + EC2の場合
EC2を使う場合、自分でEC2インスタンスを用意して、その上でコンテナを動かします。
ECS
|
v
EC2
|
v
Docker Container
|
v
Spring Boot
EC2インスタンスについて、
- インスタンスタイプ
- OS
- パッチ
- キャパシティ
などを意識する必要があります。
ECS + Fargateの場合
Fargateを使う場合は、
ECS
|
v
Fargate
|
v
Docker Container
|
v
Spring Boot
という構成になります。
利用者は主に、
CPUはこれくらい
メモリはこれくらい
このDockerイメージを使う
といったTaskの実行に必要な設定を指定します。
そのため、コンテナを実行するためのEC2インスタンスを自分で用意・管理する必要がありません。
Fargateは仮想サーバーなのか?
ここが個人的に最初かなり混乱した部分です。
FargateはEC2のように、
仮想サーバーを1台借りて自由に操作するサービス
ではありません。
EC2なら、
EC2
↓
SSH
↓
Linuxを操作
↓
アプリを起動
という使い方ができます。
一方Fargateでは、基本的に利用者がEC2インスタンスそのものを管理することはありません。
AWS側がコンテナ実行基盤を管理し、利用者はTaskに必要なCPUやメモリなどを指定します。
そのため、
EC2 = 仮想サーバーを借りる
Fargate = サーバー管理を意識せずコンテナを実行する
と考えると理解しやすいです。
ALBとは
ALBは Application Load Balancer の略です。
名前の通りロードバランサーの一種で、主にHTTP/HTTPSのリクエストを複数のターゲットへ振り分けます。
例えばFargate Taskが2つある場合を考えます。
+--> Task A
ユーザー --> ALB
+--> Task B
ユーザーが直接それぞれのTaskを意識するのではなく、ALBがリクエストを受け取り、利用可能なターゲットへ転送します。
なぜALBが必要なのか
例えばECS ServiceでTaskを複数動かしているとします。
Task A
Task B
Task C
ユーザー側からすると、
どのTaskにアクセスすればいいの?
となります。
そこでALBを入口として配置します。
+--> Task A
|
Internet --> ALB +--> Task B
|
+--> Task C
ユーザーはALBにアクセスすればよく、その先のTaskへの振り分けはALB側に任せられます。
ALBはTaskの状態も確認する
ALBにはヘルスチェックがあります。
例えば、
Task A → 正常
Task B → 異常
Task C → 正常
という状態なら、異常なTask Bへのリクエスト転送を避けることができます。
Webアプリを安定して公開するうえで重要な仕組みです。
ECS・Fargate・ALBを組み合わせる
ここまでをまとめると、Spring Bootアプリへのアクセスは次のような流れになります。
ユーザー
|
| HTTPS Request
v
+----------------------+
| ALB |
| リクエストを受け取る |
+----------------------+
|
| 転送
v
+----------------------+
| ECS Service |
| Taskの稼働数を維持 |
+----------------------+
|
v
+----------------------+
| Fargate Task |
| |
| Docker Container |
| +------------------+ |
| | Spring Boot | |
| +------------------+ |
+----------------------+
役割を一言で表すと、
ALB
↓
リクエストを受け取り、適切なターゲットへ転送する
ECS
↓
コンテナを管理する
Fargate
↓
コンテナを実行するための環境を提供する
Docker
↓
Spring Bootアプリをコンテナとしてまとめる
Spring Boot
↓
実際のWebアプリケーション
という関係になります。
ECSとFargateはセットなのか?
必ずしも、
ECS = Fargate
ではありません。
ECSはコンテナを管理するサービスで、Fargateはコンテナを実行するための選択肢の一つです。
例えば、
ECS
├── EC2で実行
└── Fargateで実行
という選択肢があります。
そのため、
ECSとFargateは何が違うの?
という疑問に対しては、
ECSはコンテナを管理するサービスで、Fargateはそのコンテナを実行するためのコンピューティング環境の一つ
と考えると整理しやすいです。
Dockerとの関係
DockerとECS/Fargateも最初は混同しやすいところです。
Dockerはアプリケーションとその実行に必要なものをコンテナイメージとしてまとめるために利用できます。
例えばSpring Bootなら、
Spring Bootアプリ
↓
Dockerfile
↓
Docker Image
↓
Container
となります。
AWSでは、そのDockerイメージをECR(Elastic Container Registry)などに保存し、ECSから利用できます。
Spring Boot
↓
Docker Image
↓
ECR
↓
ECS
↓
Fargate Task
つまり、
Dockerはアプリをコンテナ化する技術
ECRはDockerイメージなどを保存する場所
ECSはコンテナを管理するサービス
Fargateはコンテナを実行する環境
という関係になります。
まとめ
ECS・Fargate・ALBは一気に登場するため最初は混同しやすいですが、それぞれの担当を分けて考えると理解しやすくなります。
| サービス・用語 | 役割 |
|---|---|
| ALB | HTTP/HTTPSリクエストをターゲットへ振り分ける |
| ECS | コンテナを管理する |
| ECS Service | 必要なTask数を維持する |
| Task Definition | Taskをどう動かすか定義する |
| Task | 実際に実行されているコンテナ群 |
| Fargate | コンテナの実行環境を提供する |
| ECR | コンテナイメージを保存する |
| Docker | アプリケーションをコンテナ化する |
| Spring Boot | 実際に動作するアプリケーション |
特に、
ALB → リクエストを振り分ける
ECS → コンテナを管理する
Fargate → コンテナを実行する
という3つの役割を最初に覚えておくと、AWSのコンテナ構成がかなり理解しやすくなります。
次回は、この構成でSpring Bootアプリを動かした場合に、Fargate・ALB・RDS・NAT Gatewayなどのどこで料金が発生するのかを整理します。