今さら聞けないAWS ECSとは？Fargateとは？

# この記事について

AWSにおけるコンテナオーケストレーションツールとして定番になっているECSとサーバレスでECSを稼働させるFargateについて、入門向けに説明します。
まだECSやFargateについて知らない、理解してない方がいればぜひご一読ください。

また別の記事にFargateを利用してWebサイトを構築する方法についても記載しておりますので、併せてご参照いただけると幸いです。

https://qiita.com/K5K/items/2bab270b8fad24505303

# この記事のゴール

`ECSとFargateが何かを理解する`

# ECSとは

- AWSが提供するフルマネージドコンテナオーケストレーションサービス
- オーケストレーション = 管理

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/d571d2f4-3535-a8f8-390e-d5f7e384c1e2.png)

## オーケストレーションがある世界/ない世界

### オーケストレーションがない世界(管理対象1つ)
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/4f5430ab-93c4-2f1e-4569-3dfa80311a8b.png)


### オーケストレーションサービスがない世界(管理対象複数)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/05f2feff-f249-69cb-1226-bf758f4f8a06.png)

### オーケストレーションがある世界

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/34eea7d5-9a5f-61a5-48f4-b9e7e88bd06e.png)

## つまりECSとは

`コンテナをいい感じに管理してくれるサービス`


## 参考:AWSのオーケストレーションサービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/a870a623-81fe-86b6-e65d-49e645a26ccd.png)

# Fargateとは

- ECSで利用可能なサーバレスコンテナ実行環境
- ECSの基盤となるインスタンスの管理をオフロードする
- つまり管理者はインスタンスの運用から解放される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/26a6d169-5e9a-1819-ecca-e026c9f1ef7e.png)

## コントロールプレーン/データプレーン

AWS(ECSやEKS)のコンテナサービスはコントロールプレーンとデータプレーンの2つで構成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/2d48893a-fd1e-8524-28f8-4bf27bf965cc.png)

データプレーンには２種類ある

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/30c8ae1d-27ca-753a-a9c8-2bb2d2408e0d.png)

ではデータプレーンはEC2とFargateどちらを利用するべきか？ => `特別な理由がない限りはFargateを使うべし！`

Fargateだと若干ランニングコストが高くなる、ただしインスタンス管理の運用コストが発生しない。
それに対してEC2だとランニングコストは安くなるが、インスタンス管理の運用コストが発生する。

運用コストを考慮するとEC2の方が安くなるわけではないので、運用コストがかからないFargateを利用した方が良い。

### 参考

FargateとEC2を比較した結果、FargateではなくEC2を剪定したケースもあります。
https://tech.uzabase.com/entry/2022/12/01/175423

本格的な検討をする際は優先度や料金シミュレーションをするべきだと思います。

# ECSの構成要素

- クラスター
- タスク
- タスク定義
- サービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/dcc300ac-a540-2732-10b5-3ab1419c5513.png)

## クラスター

`ただの箱`

- サービスとタスクを分離するための論理グループ
- 実行環境やIAM権限の境界線

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/be7885eb-238b-1889-98a4-f0a70b1d74d3.png)


## タスク

`アプリケーションを実行するコンテナ群`

- アプリケーションの実行単位
- 1つ以上のコンテナから構成される
- (同じタスクのコンテナは同じホスト上で稼働する)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/73f26bef-58b5-c6c1-ff58-f674f94f174a.png)

## タスク定義

`タスクの金型`

- タスクを構成するテンプレート
- アプリケーションを構成する1つ以上のコンテナを定義する
- JSON形式で記述される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/e5071eee-ced0-d1cc-066e-54dea8231df1.png)

## サービス

`タスクの管理人`

- 起動タイプを指定(Fargate or EC2)
- タスク実行数を定義
- タスク数を維持
- ELBと連携

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/e189c4aa-45e2-324a-c7cd-a6ad238bd16c.png)

# ECSにおけるコンテナの実行方法

ECSにおいてコンテナを実行させる方法は２つある。

## 方法1. タスクから直接実行

- コンテナが終了したら、タスクも終了
- バッチ処理などにて利用する

## 方法2. サービスから実行

- 指定したタスク数を維持する
- ELBなどの他サービスとの連携が可能
- Webアプリケーションなどの常時起動処理にて利用する


# ECSで稼働するアプリケーションの更新方法

タスク定義の新しいリビジョンを作成して、サービスにてリビジョンの指定を更新する

更新前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/ed67fd4a-fd8d-44eb-8fee-e00821129276.png)


更新後(サービスが参照するタスク定義のリビジョンが更新される)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435280/698270d8-3035-153f-1d66-8f1baa11dca3.png)


# まとめ

- ECSとは
    - AWSが提供するフルマネージドコンテナオーケストレーションサービス
    - オーケストレーション = 管理
    - コンテナをいい感じに管理してくれるサービス
- Fargateとは
    - ECSで利用可能なサーバレスコンテナ実行環境
    - ECSの基盤となるインスタンスの管理をオフロードする
    - 管理者はインスタンスの運用から解放される
- ECSの構成要素
    - クラスター = `ただの箱`
    - タスク = `アプリケーションを実行するコンテナ群`
    - タスク定義 = `タスクの金型`
    - サービス = `タスクの管理人`