Amazon ECSについて整理してみた

# 背景・目的
最近、コンテナについて多く触れる機会があり、あらためてですが、AWSが提供しているECSについて整理します。

# まとめ
下記に特徴、および説明を整理します。

|特徴|説明|
|:--|:--|
|ECSとは|・コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケーリングできる<BR>・コンテナオーケストレーションサービス<BR>・フルマネージドサービス<BR>・ECRや、Dockerなどに統合されている<BR>・リージョン間、オンプレミンスでコンテナワークロードを実行、スケーリング可能|
|ECSの3つのレイヤ|・Capacity Options<BR>・Controller<BR>・Provisioning|
|Capacity Options|コンテナが稼働するインフラ|
|Controller|アプリケーションを管理するソフトウェア<BR>キャパシティオプションと配置可能な場所を指定する|
|Provisioning|プロビジョニングには、下記のとおり複数の選択肢がある<BR>・マネコン<BR>・CLI<BR>・SDK<BR>・Copilot<BR>・CDK|
|アプリケーションのライフサイクル|1. コンテナの作成<BR>2. レジストリへの保存<BR>3. タスク定義の作成<BR>4. タスク定義を元にクラスタへデプロイ<BR>5. 監視|


# 概要
## Amazon Elastic Container Service とは

[Amazon Elastic Container Service とは](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html)　を基に整理します。

> Amazon Elastic Container Service (Amazon ECS) は、コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケーリングできる、完全マネージド型のコンテナオーケストレーションサービスです。フルマネージドサービスである Amazon ECS には、AWS の設定と運用に関するベストプラクティスが組み込まれています。Amazon Elastic Container Registry や Docker などの AWS とサードパーティーツールの両方に統合されています。この統合により、チームは環境ではなくアプリケーションの構築に集中しやすくなります。コントロールプレーンの複雑な管理は必要なく、クラウドの AWS リージョン 間またはオンプレミスで、コンテナワークロードを実行およびスケーリングできます。

- コンテナ化されたアプリケーションを簡単にデプロイ、管理、スケーリングできる
- コンテナオーケストレーションサービス
- フルマネージドサービス
- ECRや、Dockerなどに統合されている
- リージョン間、オンプレミンスでコンテナワークロードを実行、スケーリングできる

### ECSの用語とコンポーネント
> Amazon ECS には次の 3 つのレイヤーがあります。
> - 容量 - コンテナが稼働するインフラストラクチャ
> - コントローラー - コンテナ上で実行されるアプリケーションをデプロイして管理します
> - プロビジョニング - スケジューラーと連携してアプリケーションやコンテナをデプロイおよび管理するために使用できるツール

- 下記の3つのレイヤがある
    - Capacity Options
    - Controller
    - Provisioning

#### Capacity Options
> Amazon ECS キャパシティは、コンテナが稼働するインフラストラクチャです。以下は、容量オプションの概要です。
> - クラウド内 AWS の Amazon EC2 instances
インスタンスタイプ、インスタンス数を選択し、容量を管理します。
> - AWS クラウドでの (AWS Fargate (Fargate)) サーバーレス
Fargate はサーバーレスの従量制料金計算エンジンです。Fargate を使用すると、サーバーを管理したり、容量計画に対処したり、セキュリティのためにコンテナワークロードを分離したりする必要がなくなります。
> - オンプレミス仮想マシン (VM) またはサーバー
Amazon ECS Anywhere は、オンプレミスサーバーや仮想マシン (VM) などの外部インスタンスを Amazon ECS クラスターに登録するためのサポートを提供します。


- ECSキャパシティは、コンテナが稼働するインフラ
- 下記のキャパシティオプションがある
    - EC2
    - Fargateサーバレス
    - オンプレミスのVM、またはサーバー

> キャパシティは次の AWS リソースのいずれかに配置できます。
> - アベイラビリティーゾーン
> - ローカルゾーン
> - Wavelength Zone
> - AWS リージョン
> - AWS Outposts

- AWSリソースのいずれかに配置可能
    - AZ
    - ローカルゾーン
    - Wavelength Zone
    - リージョン
    - Outposts


#### Controller
> Amazon ECS スケジューラは、アプリケーションを管理するソフトウェアです。

- アプリケーションを管理するソフトウェア


#### Provisioning
> Amazon ECS のプロビジョニングには複数のオプションがあります。
> - AWS Management Console — Amazon ECSリソースへのアクセスに使用するウェブインターフェイスを提供します。
> - AWS Command Line Interface (AWS CLI) — Amazon ECSを含む一連のさまざまな AWS サービス用のコマンドを提供します。Windows、Mac、Linux でサポートされています。詳細については、「AWS Command Line Interface」を参照してください。
> - AWS SDK — 言語固有の API を提供し、接続の詳細の多くを処理します。これらには、署名の計算、リクエストの再試行処理、エラー処理などを含みます。詳細については、AWS SDK を参照してください。
> - Copilot — Amazon ECS で本番稼働可能なコンテナ化されたアプリケーションを構築、リリース、運用するためのオープンソースツールをデベロッパーに提供します。この詳細については、GitHub ウェブサイトの Copilot を参照してください。
> - AWS CDK - 使い慣れたプログラミング言語を使用して、クラウドアプリケーションリソースをモデル化およびプロビジョニングするために使用できるオープンソースのソフトウェア開発フレームワークを提供します。AWS CDK は、AWS CloudFormation を通じて安全かつ繰り返し可能な方法でリソースをプロビジョニングします。

- プロビジョニングには、下記のとおり複数の選択肢がある
    - マネコン
    - CLI
    - SDK
    - Copilot（※1）
    - CDK


※1 Copilotについては、以前、[AWS Copilot CLIを試してみた](https://qiita.com/zumax/items/bc89fb76db531742499b)で整理・検証した記事を載せています。 よろしければご覧ください。

## アプリケーションのライフサイクル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5bca2d3c-1840-8554-a627-acff355fea65.png)
出典：[Amazon Elastic Container Service とは > アプリケーションのライフサイクル](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html#welcome-lifecycle)

> アプリケーションをコンテナ上で実行できるように設計する必要があります。コンテナとは、ソフトウェアアプリケーションの実行に必要なものをすべて保持する、標準化されたソフトウェア開発の単位です。これには、関連するコード、ランタイム、システムツール、およびシステムライブラリが含まれます。コンテナは、イメージと呼ばれる読み取り専用テンプレートから作成されます。イメージは通常 Dockerfile から構築されます。Dockerfile は、コンテナを構築するための手順を含むプレーンテキストファイルです。これらのイメージは、Amazon ECR など、構築された後にダウンロード可能な場所であるレジストリに保存されます。

> イメージを作成して保存した後、Amazon ECS のタスク定義を作成します。タスク定義はアプリケーションのブループリントです。これは、アプリケーションを形成するパラメータと 1 つ以上のコンテナを記述する JSON 形式のテキストファイルです。例えば、オペレーティングシステムのパラメータ、使用するコンテナ、アプリケーションで開くポート、タスクのコンテナで使用するデータボリュームなどの指定に使用できます。タスク定義で使用できる特定のパラメータは、お客様の特定のアプリケーションのニーズによって異なります。

> タスク定義を定義したら、それをサービスまたはタスクとしてクラスターにデプロイします。クラスターは、クラスターに登録されているキャパシティインフラストラクチャ上で実行されるタスクまたはサービスを論理的にグループ化したものです。

> タスクはクラスター内のタスク定義のインスタンス化です。スタンドアロンタスクを実行することもできますし、サービスの一部としてタスクを実行することもできます。Amazon ECS サービスを使用すると、Amazon ECS クラスターで必要な数のタスクを同時に実行して維持できます。仕組みとしては、タスクがいずれかの理由で失敗または停止した場合に、Amazon ECS サービススケジューラがタスク定義に基づいて別のインスタンスを起動することによって動作します。これは、それを置き換え、サービス内の必要な数のタスクを維持するために行われます。

> コンテナエージェントは Amazon ECS クラスター内の各コンテナインスタンス上で実行されます。エージェントは、現在実行中のタスクとリソースのコンテナの使用率に関する情報を Amazon ECS に送信します。Amazon ECS からのリクエストを受信するたびに、タスクを開始および停止します。

> タスクまたはサービスをデプロイしたら、次のいずれかのツールを使用してデプロイとアプリケーションを監視できます。
> - CloudWatch
> - Runtime Monitoring

- 以下のライフサイクルになります
    1. コンテナの作成
    1. レジストリへの保存
    1. タスク定義の作成
    1. タスク定義を元にクラスタへデプロイ
    1. 監視

## 上記で登場した用語の整理
### コンテナ
[クラウドコンテナとは何ですか?] (https://aws.amazon.com/jp/what-is/cloud-containers/)を基に整理します。

> クラウドコンテナとは何ですか?
クラウドコンテナは、アプリケーションのコード、ライブラリ、およびクラウドで実行するのに必要なその他の依存関係を含むソフトウェアコードパッケージです。どのソフトウェアアプリケーションコードでも、実行する前にライブラリと依存関係と呼ばれる追加ファイルが必要です。従来、Windows、Linux、Mac、モバイルなどのさまざまな環境で実行するには、ソフトウェアを複数のフォーマットでパッケージ化する必要がありました。ただし、コンテナはソフトウェアとそのすべての依存関係をどこでも実行できる 1 つのファイルにパッケージ化します。コンテナをクラウドで実行することで、規模に応じて柔軟性とパフォーマンス上のメリットをさらに得られます。


- ソフトウェアコードパッケージ
- 下記のようなものが含まれる
    - アプリコード
    - ライブラリ
    - 必要なソフトウェアパッケージ
- OS問わずどこでも実行可能な形にパッケージする


[コンテナ化とは?](https://aws.amazon.com/jp/what-is/containerization/)を基に整理します

> コンテナ化は、アプリケーションのコードを、あらゆるインフラストラクチャで実行するために必要なすべてのファイルとライブラリにバンドルするソフトウェアデプロイプロセスです。従来、コンピュータでアプリケーションを実行するには、マシンのオペレーティングシステムに合ったバージョンをインストールする必要がありました。例えば、Windows マシンには Windows バージョンのソフトウェアパッケージをインストールする必要がありました。しかし、コンテナ化を使用することで、あらゆるタイプのデバイスやオペレーティングシステムで実行される単一のソフトウェアパッケージ (コンテナ) を作成できます。 

- あらゆるインフラで実行するために必要なファイルやライブラリをば

> ソフトウェアアプリケーションの実行に必要なものをすべて保持する、標準化されたソフトウェア開発の単位です。これには、関連するコード、ランタイム、システムツール、およびシステムライブラリが含まれます。コンテナは、イメージと呼ばれる読み取り専用テンプレートから作成されます。

- ソフトウェアの単位
- コード、ランタイム、システムツール、ライブラリが含まれる
- イメージと呼ばれるRead Onlyなテンプレート（大抵はDockerfile）から作成される


### イメージ
[Docker イメージとコンテナの違い](https://aws.amazon.com/jp/compare/the-difference-between-docker-images-and-containers/)を基に整理します。

> コンテナ作成の手順を含む読み取り専用のテンプレートです。Docker イメージは、アプリケーションを実行するためにコンテナ内で必要なライブラリと依存関係のスナップショットまたはブループリントです。

- コンテナ作成の手順を含む読み取り専用のテンプレート
- アプリケーションを実行するためにコンテナ内で必要なライブラリと依存関係のスナップショット、またはブループリント

### レジストリ
[コンテナレジストリとは](https://www.redhat.com/ja/topics/cloud-native-apps/what-is-a-container-registry)を基に整理します。

> コンテナレジストリは、コンテナイメージの保存とアクセスに使用されるリポジトリ (またはリポジトリのコレクション) です。コンテナレジストリはコンテナベースのアプリケーション開発をサポートでき、多くの場合 DevOps プロセスの一環として使用されます。コンテナレジストリは、 Docker や Kubernetesなどのコンテナ・オーケストレーション・プラットフォームに直接接続できます。 
> コンテナレジストリはシステム間でコンテナイメージを共有するための仲介役として機能し、クラウドネイティブ・アプリケーションの作成と提供にかける開発者の貴重な時間を節約します。

- コンテナレジストリは、コンテナイメージの保存とアクセスに使用されるリポジトリ
- Dockerや、k8sなどのコンテナオーケストレーションプラットフォームに直接接続できる
- システム間でコンテナイメージを共有するための仲介役として機能する


### タスク
> タスクはクラスター内のタスク定義のインスタンス化です。スタンドアロンタスクを実行することもできますし、サービスの一部としてタスクを実行することもできます。Amazon ECS サービスを使用すると、Amazon ECS クラスターで必要な数のタスクを同時に実行して維持できます。仕組みとしては、タスクがいずれかの理由で失敗または停止した場合に、Amazon ECS サービススケジューラがタスク定義に基づいて別のインスタンスを起動することによって動作します。これは、それを置き換え、サービス内の必要な数のタスクを維持するために行われます。

- クラスター内のタスク定義のインスタンス
- スタンドアロンやサービスの一部としてタスクを実行することもできる
- ECSを利用すると、クラスターで必要な数のタスクを同時に実行し、維持できる


### タスク定義
> タスク定義を定義したら、それをサービスまたはタスクとしてクラスターにデプロイします。クラスターは、クラスターに登録されているキャパシティインフラストラクチャ上で実行されるタスクまたはサービスを論理的にグループ化したものです。

- タスク定義を定義すると、サービス、タスクとしてクラスターにデプロイする

### コンテナエージェント
> コンテナエージェントは Amazon ECS クラスター内の各コンテナインスタンス上で実行されます。エージェントは、現在実行中のタスクとリソースのコンテナの使用率に関する情報を Amazon ECS に送信します。Amazon ECS からのリクエストを受信するたびに、タスクを開始および停止します。

- ECSクラスタ内の各コンテナインスタンス上で実行される

### コンテナオーケストレーション
[コンテナオーケストレーションとは何ですか?](https://aws.amazon.com/jp/what-is/container-orchestration/)を元に整理します。

> コンテナオーケストレーションは、アプリケーションを大規模に展開できるように、コンテナのネットワークと管理を自動化するプロセスです。コンテナ化は、アプリケーションのコードを、任意のインフラストラクチャで実行するために必要なすべてのファイルとライブラリにバンドルします。マイクロサービスアーキテクチャには、アプリケーションが拡大して複雑になるにつれて、数百、場合によっては数千のコンテナが含まれる場合があります。コンテナオーケストレーションツールは、プロビジョニングやスケジューリングからデプロイや削除までのライフサイクル全体を自動化することで、コンテナインフラストラクチャの管理を簡素化することを目的としています。組織は、追加のメンテナンスのオーバーヘッドを発生させることなく、大規模なコンテナ化の恩恵を受けることができます。

- コンテナのNWと管理を自動化するプロセス
- コンテナオーケストレーションツールにより下記のライフサイクル全体を自動化することで、管理を簡素化することを目的としている
    - プロビジョニング
    - スケジューリング
    - デプロイ
    - 削除

つまり、プロビジョニング＝コンテナの配置を管理することで、ホストへの負荷が平準化されるように負荷分散する点や
特定のホストがダウンした場合に、復旧する事が可能になる。

#### オーケストレーションの代表例
- Kubernates
- Amazon EKS(AWS)
- GKE(Google)
- AKS(Azure)
- OKE(Oracle)

# 考察
今回、ECSの用語について簡単に整理しました。今後は実際に手を動かしてみます。


# 参考
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html

https://qiita.com/zumax/items/bc89fb76db531742499b

https://aws.amazon.com/jp/what-is/container-orchestration/