ECSについて理解した事をまとめた

# 概要
ECSの基本的な概念を理解していなかったので、自分なりにまとめてみました。

# ECS(Amazon Elastic Container Service)の特徴
- ECSは、コンテナ化されたアプリケーションの管理・運用を自動化する為の技術。この技術の事を**コンテナオーケストレーション**と言う
- 他のAWSサービスと連携する事で、コンテナを使用した大規模なサービスの構築が容易
- フルマネージドでコンテナを管理してくれる

## AWS上でのコンテナ実行における選択肢
コンテナオーケストレーションは、「<font color="red">**コントロールプレーン**</font>」と「<font color="lime">**データプレーン**</font>」という2つの概念から成り立っている

<font color="red">**コントロールプレーン**</font> : コンテナを管理する為のサービス
- **ECS**
- **EKS**

<font color="lime">**データプレーン**</font> : コンテナを稼働させる為のサービス
- **EC2**
- **AWS Fargete**



どの起動タイプも、コンテナオーケストレーションを実現する為に、**コンテナオーケストレータ**と**ECSコンテナエージェント**と言うミドルウェアが必要となる。
- EC2タイプの場合は、コンテナオーケストレータとECSコンテナエージェントが組み込まれたEC2が起動する
- Fargateの場合は、Fargateコンテナエージェントが導入されている。AWS側で管理されている為、意識する必要は無い

![コンテナオーケストレーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/f0882317-d016-2273-7881-9356b097a429.png)

### `ECS`と`EKS`の違い
ECS : AWSが独自で構築して開発したコンテナオーケストレーションシステム
EKS : `Kubernetes(K8s)`を基盤に構築して開発したコンテナオーケストレーションシステム

### 補足
コンテナオーケストレーションツールは、Docker Swarm（Docker社）、OpenShift(Red Hat)、Rancher(OSS(オープンソース))、Mesos/Marathon等がある

# コンテナオーケストレータ
- 設定に基付いて、コンテナの状態を維持、管理する様にECSコンテナーエージェントに指示を出す機能
- サービスディスカバリ、ローリングアップデート、自動スケーリング、ロードバランシング等を設定に基付いて行う



### 補足
[サービスディスカバリ](https://aws.amazon.com/jp/blogs/news/amazon-ecs-service-discovery/) : ECSクラスタ内で他のコンテナへアクセスする為のAレコード登録を自動的に`ECS`と`Route 53`にお願いできる
[ローリングアップデート](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deployment-type-ecs.html) : 全てのタスク（コンテナのインスタンス）を同時に更新するのではなく、一部のタスクだけを順次更新していく方法
Aレコード : IPアドレス（IPv4形式）とドメイン名の関連付けを定義するレコード(書き方は以下)
```sh
hp-shizuoka.jp. IN A 192.168.0.1
www.hp-shizuoka.jp. IN A 192.168.0.1
```

# ECSコンテナエージェント　
- コンテナの中で動作している
- オーケスレータからの指示を基に、エージェントを通して、コンテナの維持、管理を行う機能
- クラスタの所属場所、コンテナの起動状況、コンテナのCPUやメモリの情報等をオーケストレータに送信している
- `Amazon ECS-optimized AMI`を元に起動した場合、事前にインストール済み
- 自前で用意したEC2に対して、ECSコンテナエージェントをインストールして使用する事も可能
- ECSエージェントのイメージ図を以下に記載

![ecs-agent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/f64299e3-bca4-da7f-03e4-d3014c1018fe.png)

ECSエージェントのGitHub

https://github.com/aws/amazon-ecs-agent

# コンテナオーケストレータ(Orchestrator)とエージェント(Agent)用いた場合の仕組み
管理者とサーバーの間いに、**Orchestrator**、 **Agent**と言う仕組みを設置する。

1. サーバーの管理者 or コンテナの管理者は、Orchestratorに対して何らかの指示(API call)を行う
2. Orchestratorは、サーバーの中で動作しているAgentに対してコマンドを送る
3. Agentは、Container Runtime(Docker Engine)に対してコマンドを送る
4. イメージレジストリーにあるコンテナイメージをダウンロードする
5. コンテナイメージを元に、コンテナが立ち上がる 

![スクリーンショット 2024-05-14 17.30.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/fbf2bab6-3dc4-e1ac-c9ea-374baefb6c6c.png)


## コンテナオーケストレーションの重要性
### コンテナオーケストレーションを使用していない
- 多数のコンテナを複数台のサーバで運用していると、どのサービスのどのコンテナがどのサーバで動いているのかを常に意識し、管理し続ける必要があり、運用負荷が高まる
- 運用の複雑化は、ヒューマンエラーを引き起こしかねない

上記の問題から、コンテナ運用が上手くいかなくなり、サービスの維持が難しくなる

![スクリーンショット 2024-05-14 22.37.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/ae89026b-85bb-4a47-8791-cfb716a40753.png)


### コンテナオーケストレーションを使用している
- オーケストレータがある事で、管理者の指示をオーケスレータが受け取り、オーケスレータがコンテナホスト(クラスタ)に対してまとめて指示を出せる
- 各コンテナホストで動いている`Agent`がコンテナの状態を確認し、あるべき状態を維持、管理したり、設定した状態を維持、管理したりする
- コンテナオーケストレーションを用いて構築したコンテナは、複数のコンテナホストがある場合でも安全にサーバ運用が実現できる

### 補足
コンテナホスト : コンテナ化されたアプリケーションを実行する為のサーバーまたは仮想マシン
コンテナオーケストレーション　: コンテナの管理・運用を自動化して運用する技術
![スクリーンショット 2024-05-14 22.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/db75d9f3-0e24-4982-c90c-23bce0682530.png)

# ECSの起動タイプ
ECSではコンテナを動かす為の実行環境（<font color="lime">**データプレーン**</font>）として「<font color="fuchsia">**AWS Fargate**</font>」と「<font color="fuchsia">**ECS on EC2**</font>」、「<font color="fuchsia">**ECS Anywhere**</font>」の3つの起動タイプがある
- 「<font color="fuchsia">**AWS Fargate**</font>」と「<font color="fuchsia">**ECS on EC2**</font>」は、AWS上の仮想サーバ上で起動させる
- 「<font color="fuchsia">**ECS Anywhere**</font>」は、オンプレミス環境で<font color="red">**コントロールプレーン**</font>としてECSを使用する為の機能
(今回は、ECS Anywhereについての詳細は割愛する)


## ECS on EC2
EC2（Elastic Compute Cloud）インスタンスを使った仮想サーバ上でコンテナを起動するタイプ

## 仕組み
- クラスタ(コンテナホスト群)の中で多数のEC2が動作し、各EC2の中でコンテナを動作させる
- ECSで立ち上げたEC2には、`OS(Operating System)`、`ecc-agent`、`Docker Engin`が組み込まれている


![スクリーンショット 2024-05-16 13.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/a0a27be0-333e-07f4-42a5-39d2e688f31c.png)

## Amazon ECS-optimized AMI(仮想マシンイメージ)
- ECC on EC2は、`Amazon ECS-optimized AMI`のイメージを使用して、ECSの環境を作成する
(OSの指定は行う必要がある)
- `Amazon ECS-optimized AMI`は、DockerデーモンやECSコンテナエージェント等、コンテナインスタンスとして必要な物が全て組み込まれている仮想マシンのイメージ


## 特徴
- ホスト`OS`を柔軟に選択できる(Amazon Linux、　Windows、　Bottlerocket等)
- EC2インスタンスのスペック（CPU コア数、メモリ、ストレージ等）が柔軟に選択できる
- 実稼働リソースの`OS`に直接介入する事が出来る(カーネルパラメータ等のチューニングが可能）
- コンテナイメージを`EC2`内にキャッシュできるので`AWS Fargate`に比べてデプロイが早い
- ホスト`OS`に対して、`SSH`接続が可能

## 課題
- `OS`やソフトウェアエージェント類へのパッチ当てや更新を自前で行う必要がある
- コンテナ環境の`OS`や`Docker Engine`等、ホストマシンの管理や運用が必要

## 補足
ソフトウェアエージェント : 特定のタスクを自動的に実行する為のソフトウェア。一定のルールに基づいて動作し、ユーザーの代わりに様々なタスクを自動的に行う
(例 : メールクライアントのスパムフィルター、ウェブクローラー)



## AWS Fargate
保守管理が不要なコンテナ向けサーバレスコンピューティングエンジン。AWS上でコンテナを動かす為のサーバー(例:EC2)に対して、何の設定も行わないでコンテナを実行する事が出来る機能。

## 仕組み
クラスターの中にあるAWS Fargateが、複数のタスクを管理して動作させる

![スクリーンショット 2024-05-16 17.43.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/fe3c48d4-3c34-94a6-fc15-37582d2bf3af.png)

## 特徴
- AWSが実行環境(コンテナを動かしている環境 : EC2)の保守、運用、管理を行うので、バージョンアップやセキュリティ対策等を気にしなくて良い
- コンテナのCPUとメモリを決まった組み合わせから選択出来る
- コンテナ数をオートスケールできる

## 課題
- コンテナホスト(EC2)に対して`SSH`接続は不可能 (コンテナ内に入る事は可能)
- ホストの管理をAWS側で管理してくれる為、EC2より価格が高額になる
- パブリックIPの固定割り当てができない
(EC2インスタンスへのIPが自動割り当ての為、パブリックIPの固定割り当てができない。これにより、外部アクセスの為のIP許可や、API運用時に不便を感じる場合がある)


# ECSの主要な構成要素

![スクリーンショット 2024-05-15 23.59.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/507fceb7-fdc6-e9b1-93fe-9638a5044d18.png)


## タスク定義
タスク(コンテナ)を構成する為の定義書。

### タスク定義の主な設定項目
- コンテナの定義 : イメージ場所の指定
- コンテナ全体のCPU、メモリの設定または、コンテナ毎のCPU、メモリの設定
- タスクに割り当てるIAM : タスクが行う操作権限の範囲をタスク単位で決める事が可能
- マウントの設定 ： EFSに接続する等
- ボリュームの設定 : データを永続化する為の機能
- ネットワークモードの選択
Fargate : avsvpc
EC2 : host(非推奨)、 bridge(Dockerの標準)、 none(特殊パターン)、 default(=bridge), awsvpc(AWS推奨)

## タスク
タスク定義に基づいて起動するコンテナの集まり。1つのタスクに対して、1つ以上のコンテナで構成されている。

### タスクの主な設定項目
- バッチ処理を行う場合は、タスクからの起動となる


## サービス
複数のタスクを束ねる概念。もう少しわかり易く書くと実行中のタスクを管理する機能。下記の設定はサービスから起動する場合しか行えない為、常に起動させたいコンテナがある場合は、サービスから立ち上げる

### サービスの主な設定項目
- タスクの実行数の維持、管理
- 起動後に動作しているタスクの維持、管理
- ALB、ELB(ロードバランサ)との連携
- Auto Scalingの設定が可能
- EC2 or Fargateの起動タイプを選択できる
(クラスタの設定によっては、選択できない場合もある)

## クラスタ
コンテナホストを束ねる概念。もう少しわかり易く書くとサービスとタスクを実行する基盤

### クラスタの主な設定項目
- 実行環境の境界 : 本番環境や開発環境を論理的に分ける事が可能
- IAM権限の境界 : クラスタが行う操作権限の範囲をクラスタ単位で決める事が可能
- スケジュールされたタスクの実行が設定可能 : コンテナの起動時間の設定が可能

# 補足
# サーバー上でコンテナを動作させる仕組み(dockerの場合)
ローカル環境にて、dockerを使用して動作させるのと殆ど同じ挙動となる

1. サーバーの管理者 or コンテナの管理者がコンテナを実行したいサーバーに`ssh`等でログインする
2. `docker run`等のdockerコマンドを実行する
3. dockerコマンドが入力された事で、Docker Engineがイメージレジストリーにあるコンテナイメージをダウンロードする
4. コンテナイメージを元に、コンテナが立ち上がる 

![スクリーンショット 2024-05-14 17.20.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/944e517c-70ee-26a7-87fc-74031fd9ae2f.png)


# 参考資料
- [[公式]Amazon Elastic Container Service とは](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html)
- [[AWS Black Belt Online Seminar] CON201 ECS 入門](https://pages.awscloud.com/rs/112-TZM-766/images/202108_AWS_Black_Belt_Containers201-ECS.pdf)
- [[AWS Black Belt Online Seminar] CON202 ECS での Fargate 入門](https://pages.awscloud.com/rs/112-TZM-766/images/202108_AWS_Black_Belt_Containers201-ECS.pdf)
- [【初心者向け】Amazon ECS と EKS 入門！完全ガイド](https://zenn.dev/issy/articles/zenn-ecs-vs-eks)
- [ECSとは？ コンテナの基礎からECSの概要まで解説](https://www.sunnycloud.jp/column/20201215-01/)
- [AWSでコンテナを支えるサービスについて ECS、EKS、Fargateの違いは？　第１回](https://www.sunnycloud.jp/column/20201215-01/)
- [ECSの基本を理解する(クラスター、サービス、タスク定義、タスク)](https://envader.plus/article/180)
- [ECSを理解する（第2回）](https://www.bigtreetc.com/column/cloud-ecs-second/)
- [EC2 Container Serviceを使ってみる](https://qiita.com/con_mame/items/1df441d86c703a0e6fa6#:~:text=ECS%20Container%20Agent%E3%81%AFContainer,%E3%81%AE%E7%AE%A1%E7%90%86%E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

# まとめ
いろんなサイトを見て、自分なりに分かりやすくまとめてみました。もし、気になる点や間違ってる部分がありましたら、ご連絡頂ければと思います。