Amazon ECS

#◼︎Amazon ECSとは#
Dockerコンテナサービスです。
※コンテナについての理解は、 ⬇︎の記事で。

https://qiita.com/leomaro7/items/1dcebca03a1023169ad3

様々なシステムやサービスの配置/設定/管理を自動化してくれる、要するにオーケストレーションです。

簡単に言うと・・・

アプリケーションの開発に専念したい！インフラ基盤を一から構成するのは面倒！
だから予め設定を保存して必要な時に呼び出してすぐアプリ開発ができるようにしちゃえ！
という考え方です。

（例）
1日のうちサーバの台数を
昼に10台
夜に10台
で計20台必要な異なるアプリケーションを運用していた場合

今までは、アプリケーションの実行環境毎にサーバを用意する必要がありました。
Dockerを使うと、昼に必要なリソースと夜に必要なリソースを同じ10台の中で管理をすることでサーバのコストを約半分に出来ます。
今までのDockerはこのサーバリソースが足りなくなった場合などの時はユーザー側でリソースの拡張を行なっていましたが、ECSなら、このサーバのリソースの拡張を自動で行なってくれるので、ユーザーがリソースの心配をすること無くDockerを利用することができる。


#◼︎構成要素#
![スクリーンショット 2018-11-30 19.48.26.png](https://qiita-image-store.s3.amazonaws.com/0/280929/87acd218-5ecd-4783-e238-b8e906b7a8f9.png)

|項目|説明|
|:-----:|:-----|
|Cluster|タスクやサービスを使う論理的なグループです。<br>[Amazon ECS クラスター](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_clusters.html)|
|Task Definition|どうコンテナを実行するかの情報であり、その定義が書かれたものです。<br>[Amazon ECS タスク定義](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definitions.html)|
|Task|Task Definitionの情報から起動させたコンテナの実行単位です。|
|Service|実行されているTaskの数を希望数に保つ機能です。|

ここでは、この用語について覚えておけばOK。
次から実際に触れて覚えていきましょう。


##1.クラスターの作成##
**クラスターについて・・・**
簡単にいうと、Dockerコンテナを動かすEC2インスタンスの集合体です。

と言ってもわからないですよねw

なので、とりあえずはクラスターを作成していきましょう。

「クラスター」から「クラスターの作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0b42f912-f386-eb74-0205-a8243dfdf2eb.png)

**クラスターテンプレートの選択**
「EC2 Linux + ネットワーキング」を選択し「次のステップ」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8aeae72f-6229-8595-48e2-c12f51e2730f.png)

**クラスターの設定**
ここでは、Dockerを動かすEC2のスペックやVPC、セキュリティグループなどネットワーク周りの設定をしていきます。（EC2インスタンスを立てるのと同じ感覚です。）
今回は↓のような感じで「作成」

|項目|入力|
|---|------|
|クラスター名 |適当な名前 |
|プロビジョニングモデル| オンデマンドインスタンス|
|EC2 インスタンスタイプ|t2.micro| 
|T2 無制限の有効化 |チェックしない<br>[Amazon ECS コンソールに EC2 T2 無制限インスタンスのサポートを追加](https://aws.amazon.com/jp/about-aws/whats-new/2018/07/amazon-ecs-adds-console-support-for-t2-unlimited-ec2-instances/)| 
|インスタンス数 |1| 
|EBS ストレージ  |22| 
|キーペア|SSH接続をするためのキーペアです。|
|ネットワーキング|デフォルト<br>異なるAZ2つのサブネットと、ポート80でインターネットに開かれているセキュリティグループが設定されます。|
|コンテナインスタンスの IAM ロール|ecsInstanceRole<br>適切な IAM アクセス許可を使用してコンテナインスタンスを起動しないと、Amazon ECS エージェントはクラスターに接続されません。<br>[Amazon ECS コンテナインスタンス IAM ロール](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/instance_IAM_role.html) |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/8efbe22e-e9df-2479-f697-30b88142d176.png)

無事完了しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/39cce2ba-1019-6e69-6644-6f5218c59a0b.png)

「ECSインスタンス」を見ると、はい出来上がっている。
なお、本手順では実行しませんが、「ECSインスタンスのスケール」でスケールアップ/ダウンを設定していくことができます。
![スクリーンショット 2019-02-08 22.29.05.png](https://qiita-image-store.s3.amazonaws.com/0/280929/621eff53-e334-c39d-2172-5cf7efa6e6f1.png)



##2.タスク定義の作成##
タスクを起動するためのTask Definitionを作成します。
どうコンテナを実行するかの情報が書かれた定義書見たいなものでしたね。

では、これも実際に触って感じて見ましょう。

「タスク定義」から「新しいタスク定義の作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/1f5b6ace-05a6-07cc-0872-95c72ccfaab3.png)

**起動タイプの互換性の選択**
「EC2」を選択し「次のステップ」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0059516e-e519-9202-47f7-77599efc18b1.png)

**タスクとコンテナの定義の設定**
[タスク定義名]に適当な名前を入力し、「コンテナの追加」
以下はオプションです、今回は設定しません。
・(オプション)タスクロール
・(オプション)ネットワークモード
・(オプション)タスク実行ロール
・(省略可能)タスクメモリ、タスクCPU
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/1f70224d-197b-7524-bf2d-efec35693189.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d6550acf-6191-2282-f0cf-356f9bbd2408.png)

コンテナを定義していきます。
これは docker run（コンテナ作成）するとフォアグラウンド（アクティブな状態となっているタスク）で httpd を実行する Dockerイメージです。
以下のとおり入力できたら、「追加」。

|項目|入力|
|---|------|
|コンテナ名 |適当な名前|
|イメージ|httpd|
|メモリ制限（MB）|ハード制限 300　<br>コンテナは、ここで指定したメモリを超えようとすると、強制終了されます。| 
|ポートマッピング|80|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/30c8e26f-c429-b707-43cb-a8ad4b7c9438.png)

コンテナ定義が出来上がったら、「作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b1f7d2c7-f385-6e62-e7db-3bc02d97041f.png)



##3.サービスの作成##
サービスでは、タスクとクラスターを紐づけます。

サービスによって、タスク定義のコピーがクラスターに起動され、維持されます。
例えば、あるアプリケーションをサービスとして実行し、停止したタスクがある場合、停止したタスクは Amazon ECS によって自動的に回復され、指定した数のコピーが維持されます。

「サービス」タブから「作成」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/656c0aca-2fdc-ebab-51c7-988477fc9aa8.png)

**サービスの設定**
[サービス名]に適当な名前、タスクの数「1」を入力し、「次のステップ」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/3556851c-a272-6d74-f2ee-00b9805a7954.png)

*ちなみにサービスタイプって？*
・レプリカ：指定したタスク定義のインスタンスをクラスターに配置し、維持する。→タスクの数を指定できる。
・デーモン：各コンテナインスタンスにタスクの1つのコピーを配置し、維持する。→タスクの数は自動となる。

**ネットワーク構成**
**Auto Scaling (オプション)**
上記2つのステップは今回なにもせずに「次のステップ」

**サービスの確認**
「サービスの作成」で完了する。



#◼︎ECS コンテナエージェント#
ECSコンテナインスタンスにはコンテナエージェントが常駐しており、パラメータを変更することでECSの動作を調整できる。設定ファイルの場所は /etc/ecs/ecs.config。
[使用できるパラメータ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-agent-config.html)


#◼︎コンテナ実行#

##タスクの配置(EC2のみ)##

1.タスク定義で要求される要件を満たすインスタンスを識別
2.タスク定義の制約事項を満たすインスタンスを識別
3.タスク配置戦略を満たすインスタンスを識別
4.タスクを配置するインスタンスを選択

###タスク配置中に考慮されるルール###

- タスク配置中に考慮されるルールで、AZやインスタンスタイプに基づいて制約をかけられる

###タスクの配置戦略###

- タスク配置もしくは終了時にどのインスタンスを配置、終了するかを選択するアルゴリズム

|戦略タイプ|説明|
|---|----| 
|binpack|CPU またはメモリの最小利用可能量に基づいてタスクを配置。使用するインスタンス数を最小限に抑えます。|
|random|デフォルト：全てのEC2インスタンスの中からランダムに配置される|
|spread|指定された条件でバランス良く配置する|

###サービススケジューラ戦略(EC2のみ)###

- サービスをスケジューリングする際の戦略

|REPLICA|DAEMON|
|---|---|
|クラスター全体で必要なタスクの実行数を指定する。クラスター全体に対して何個のタスクを実行するか。|ホストの増減に合わせて、タスクの実行数を制御する。EC2のコンテナ1つに対して１つのコンテナ。|

https://qiita.com/leomaro7/items/3b928b6eea7fc333f460


##Amazon ECS キャパシティープロバイダー##

- タスク配置先の柔軟なコントロールが可能。例えば60%はオンデマンドで残りはスポットインスタンスにするようにする等。
 - EC2:EC2 ASG にキャパシティープロバイダー を紐付ける.
 - Fargate:キャパシティープロバイダーは⾃動的に⽤意される。


#◼︎リンク#
[Amazon ECS サービス作成に失敗する](https://qiita.com/leomaro7/items/2d8da03bb686a03934b1)
[Amazon ECS の DAEMONタイプ](https://qiita.com/leomaro7/items/3b928b6eea7fc333f460)
[Amazon ECS - EC2クラスターの作成（AWS CLI）](https://qiita.com/leomaro7/items/2587573b71ee5709c4f4)
[Amazon ECS-Blue / GreenデプロイでALBのターゲットグループを変更](https://qiita.com/leomaro7/items/d21db6563ab93479bb09)
[Amazon ECS 細かい箇所を整理してみた](https://qiita.com/leomaro7/items/6afd607f2df39f714a8e)
[Amazon ECSネットワークモードを検証してみる](https://qiita.com/leomaro7/items/41c5dfb88ca48e5a3962)
[Amazon ECS の Volumes と Bind Mount の仕組み](https://qiita.com/leomaro7/items/19ba11df36695fc85d2b)
[Amazon ECS 一通の動作](https://qiita.com/leomaro7/items/7a6db8fb0a3da915274e#8-auto-scalling)
[ECS Exec](https://qiita.com/leomaro7/items/0b8904e8b98bb0bcd95b)