1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS初心者向け:ECS・Fargate・ALBの違いと役割を整理する

1
Posted at

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などのどこで料金が発生するのかを整理します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?