AWS コンテナサービス概説 まとめ1 

## AWSの主要コンテナサービスについて
AWSの主要コンテナサービスである **ECS / EKS / Fargate** についてまとめました。
記事を読む上で、初心者の方がのみこみやすいように、
「システム構成の前提」と「私の勉強前後の考え」を記載しました。
先に読んでいただくと、各サービスについて理解しやすいと思います。

## 流れ
- システム構成の前提
- 私の勉強前後の考え
- コンテナとは
- Amazon Elastic Container Service (ECS)
- Amazon Elastic Kubernetes Service (EKS)
- AWS Fargate
- 比較・まとめ
- NEXT(コンテナ関連サービスについて)

## システム構成の前提
システム構成考える上で大切なことがあります。
（※サイバー攻撃への対策、エンドユーザーの配慮など他にもありますが、内容が逸れるため省く）

それは、**運用コストを下げること** と **障害時の対策**の対策です。

**運用コストを下げること**
例えば、サーバレスを採用することで、**サーバの管理・構築が不要**になるためその分の時間と労力をかけないで済みます。

**障害時の対策**
そもそもですが、障害時にシステムを復旧するため復旧方法（復旧のしやすさ等も）を考えるよりも、
**障害が発生してもサービスに影響を及ぼさないようにする**システム構成にする必要があります。

> 例えば、ショッピングサイトが1台のサーバのみで稼働しているとします。
> その1台のサーバに問題が生じ、サーバが停止したらショッピングサイトは停止してしまいます。
> そして、システム停止中の間ユーザはショッピングすることはできないため収益が得ることが出来なくなってしまいます。

このような問題を起こさないように、
**単一障害点**（ある1点が動かないとシステム全体に影響を及ぼす箇所）を極力減らし、
**フェイルオーバー**（システムに問題が起きた時ように、自動的に待機システムに切り替える仕組みのこと)を構成しておく必要があります。

## 私の勉強前後の考え

**勉強前の考えは**
　「コンテナを実行するためのサービスが何で複数あるんだろう」と思っていましたが、
**勉強後の考えは**
　「システムを安定稼働させる」、「運用コストを下げる」ためのサービスがあって、ユースケースに応じてサービスを選択するんだなと思いました。

 --- 

## コンテナとは
AWSのコンテナサービスの前に、そもそものコンテナについての分からない方向けに説明します。
コンテナは必要なコンポーネントをパッケージ化ものです。
また、コンテナについて勉強すると**Docker**という言葉を目にするかと思いますが、**Dockerとはコンテナを実行するための機能**です。

#### コンテナ化メリット
コンテナを活用することで、アプリケーション開発環境(ライブラリ、環境変数など)をパッケージングし、そのまま本番環境にデプロイすることが出来ます。
そして、コンテナ毎に**カーネルやOSが含まれていない**ため（サーバにはサーバごとに含まれている）、軽量かつ、リソースの無駄が少なくすることが出来ます。

#### コンテナ化デメリット
アプリケーションごとにシステムを細かく分割できるため、運用が複雑化しやすくなってしまいます。
また、複数のコンテナが特定のOS上で動くため、OSに強く依存します。
リスクについても、大元のOSに問題が起きないように特に万全な対策が必要になります。

## Amazon Elastic Container Service (ECS)
ECSはAWSが開発したコンテナ管理サービスです。
ECSは作成時に起動タイプとして「EC2」か「Fargate」を選択します。
**「EC2」か「Fargate」の選択の基準は下記です。(Fargateの詳細はFargateの項目に記載します。)**
- EC2 → サーバの構築・管理が出来る(工数をかけられる場合)場合
- Fargate → サーバの構築・管理が出来ない(工数をかけたくない)場合 

#### EC2を選択する場合
EC2のサーバ上に、Dockerコンテナを簡単に実行・停止出来きます。ECSを利用することによってDockerのインフラはAWSが行ってくれるます。
ただ、1台のサーバごとでしか、コンテナを管理できません。

#### ECSメリット
コンテナのメリットと同じ

#### ECSデメリット
複数サーバでのコンテナの一括管理が出来ない
その他、コンテナのデメリットと同じ

#### ECSユースケース
マイクロサービス構築(ソフトウェアの開発技法のこと)、小規模、Kubernetesの知見がない場合

## Amazon Elastic Kubernetes Service (EKS)
　EKSはAWS上で簡単にKubernetes(クバネティス)を利用できるようにされた、Kubernetesのマネージドサービスです。

#### Kubernetes（k8s）とは
　Kubernetesは、コンテナを効率よく運用・開発するために利用されるもので、オープンソースツールです。
　複数台のサーバにまたがったコンテナ管理ができるます。
下記のような機能があります。
- スケール(負荷に応じてコンテナの数を増減)
- コンテナイメージの管理
- 素早くビルド（コンテナイメージからコンテナ化すること）
- ロールバック（更新後など問題が起きた時に、前の状態に戻すこと）
- リソース状況の監視

Kubernetes詳細：https://kubernetes.io/ja/docs/concepts/overview/what-is-kubernetes/

#### EKSメリット
大量のコンテナを一括管理でき、スケールが容易
大規模のシステムにおいて、サービス数が増えるほどに、1サービスあたりにかかるコストを下げることが出来る(規模の経済が働きやすい)

#### EKSデメリット
サーバ数が増えやすい
Kubernetesの学習コストが高い

#### EKSユースケース
大規模、Kubernetesの知見がある場合


## AWS Fargate
　AWS Fargateとは、Amazon Elastic Container Service (ECS) と 、Amazon Elastic Kubernetes Service (EKS) で動作する、サーバレスのコンテナ実行環境です。
　**サーバレス**のため、サーバの管理(サーバーのスケーリング、パッチ適用、保護などなど)が不要になります。
　必要になるのはコンテナの操作のみのため、ECS、EKSで実行する**アプリの構築や、運用に集中**することができます。

#### Fargateメリット
サーバレスのため、サーバ管理・構築が不要
アプリケーションの開発や運用に専念できる

#### Fargateデメリット
パブリックIPの固定割り当てができないため、外部アクセスのための通信設定や、APIを活用する際に不便
sshやdocker execでのコンテナアクセスをサポートしていないため、問題が起きた時に、素早くコンテナに対してシェルで入れない
EC2を選択した場合場合と比較して起動中のコストが割増
Fargateの学習コストが低いわけではない

#### Fargateユースケース
小規模、インフラエンジニアなどがいない場合、アプリケーション開発だけに専念したい場合

## 比較・まとめ
ECS/EKS/Fargateを比較し、運用コストと障害時の対策を踏まえた最適解は下記のようになりそうです。
**ECS**　小規模から中規模構成で、インフラ担当がいる場合
**EKS**　中規模から大規模構成で、kubernetesの知見がある場合
**Fargate**　小規模～中規模でインフラ担当がいない場合

|       | サーバ有無 | 規模 |
|:-:    |:-:|:-:|
|ECS    |有|小～中|
|EKS    |有|中～大| 
|Fargate|無|小～中| 


## NEXT　まとめ中　アップ次第更新
AWSのコンテナ関連サービスとしてAWS ECRとCopilotについて記事にまとめました。
興味があったら見てみてください。
- Amazon Elastic Container Registry (Amazon ECR) コンテナイメージ管理
- AWS Copilot デプロイサービス