ECS

#ECS

> Amazon Elastic Container Service (Amazon ECS) は、クラスターで Docker コンテナを簡単に実行、停止、管理できる非常にスケーラブルで高速なコンテナ管理サービスです。Amazon ECS が管理するサーバーレスインフラストラクチャにクラスターをホストするには、Fargate 起動タイプを使用してサービスまたはタスクを起動します。また、EC2 起動タイプを使用して、現在管理している Amazon Elastic Compute Cloud (Amazon EC2) インスタンスのクラスターにタスクをホストすることで、さらに強力な統制力を得ることができます。

##コンテナとイメージ
> Amazon ECS にアプリケーションをデプロイするには、アプリケーションコンポーネントがコンテナで実行されるように設計する必要あります。Docker コンテナは標準化されたソフトウェア開発用のユニットであり、コード、ランタイム、システムツール、システムライブラリなど、ソフトウェアアプリケーションの実行に必要なものがすべて含まれています。コンテナは、イメージと呼ばれる読み取り専用テンプレートから作成されます。

> イメージは通常、Dockerfile から構築されます。これは、コンテナに含まれるすべてのコンポーネントを指定するプレーンテキストファイルです。これらのイメージはその後レジストリに保存され、そこからクラスターにダウンロードして実行できます。

<img width="543" alt="スクリーンショット 2020-05-27 16.31.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/4f08d1be-6c46-3deb-6213-2dff53c60e99.png">

##タスク定義
> Amazon ECS でアプリケーションを実行する準備をするには、タスク定義を作成する必要があります。タスク定義とは、アプリケーションを構成する 1 つ以上 (最大 10 個) のコンテナを記述する JSON 形式のテキストファイルです。アプリケーションの設計図と考えることができます。タスク定義はアプリケーションのさまざまなパラメータを指定します。タスク定義パラメータには、使用するコンテナ、使用する起動タイプ、アプリケーションのコンテナインスタンスで開くポート、タスクのコンテナが使用するデータボリュームなどがあります。タスク定義で利用できる具体的なパラメータは、使用する起動タイプに応じて変化します。

##タスクとスケジューリング
> タスクはクラスター内のタスク定義のインスタンス化です。Amazon ECS でアプリケーションのタスク定義を作成した後、クラスターで実行するタスクの数を指定できます。

> Fargate 起動タイプを使用する各タスクには独自の分離境界があり、基盤となるカーネル、CPU リソース、メモリリソース、または Elastic Network Interface は別のタスクと共有されません。

> Amazon ECS タスクスケジューラは、クラスターへのタスク配置を担当します。いくつかの異なるスケジュールオプションを使用できます。たとえば、指定された数のタスクを同時に実行および保持するサービスを定義できます。

<img width="710" alt="スクリーンショット 2020-05-27 16.39.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/7d719135-68a2-51e7-f530-a338a541c838.png">


##クラスター
> Amazon ECS を使用してタスクを実行する場合、リソースの論理グループ化であるクラスターにタスクを配置します。クラスター内のタスクで Fargate 起動タイプを使用する場合、Amazon ECS がクラスターリソースを管理します。EC2 起動タイプを使用する場合、クラスターはユーザー自身が管理するコンテナインスタンスのグループです。Amazon ECS コンテナインスタンスは Amazon ECS コンテナエージェントを実行している Amazon EC2 インスタンスです。Amazon ECS は指定されたレジストリからコンテナイメージをダウンロードし、そのイメージをクラスター内で実行します。

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

<img width="462" alt="スクリーンショット 2020-05-27 16.43.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/fa660713-9de4-b0fc-f356-a3740e008b4d.png">

#AWS Fargate での Amazon ECS
> AWS Fargate は、Amazon ECS とともに使用して Amazon EC2 インスタンスでサーバーまたはクラスターを管理する必要なくコンテナを実行できるテクノロジーです。AWS Fargate を使用すると、コンテナを実行するために仮想マシンのクラスターをプロビジョニング、設定、スケールする必要がありません。これにより、サーバータイプの選択、クラスターをスケールするタイミングの決定、クラスターのパッキングの最適化を行う必要がなくなります。

> Fargate 起動タイプを使用してタスクやサービスを実行する場合、アプリケーションをコンテナにパッケージ化し、CPU およびメモリ要件を指定して、ネットワーキングおよび IAM ポリシーを定義してから、アプリケーションを起動します。各 Fargate タスクは、独自の分離境界を持ち、基本となるカーネル、CPU リソース、メモリリソース、または Elastic Network Interface を別のタスクと共有しません。

##タスク定義
> Fargate での Amazon ECS タスクは、使用可能なすべてのタスク定義パラメータをサポートしているわけではありません。一部のパラメータはサポートされていません。また、Fargate タスクでは動作が異なるパラメータがあります。

次のタスク定義パラメータは Fargate 起動タイプでは無効です。

##ネットワークモード
> Fargate の Amazon ECS タスク定義では、ネットワークモードが awsvpc に設定されている必要があります。awsvpc ネットワークモードでは、各タスクに独自の Elastic Network Interface を提供します。

> ネットワーク設定は、サービスを作成する場合、またはタスクを手動で実行する場合にも必要

##ログ記録
> Fargate の Amazon ECS タスク定義はログ設定の awslogs、splunk、firelens、および fluentd ログドライバーをサポートします。

> awslogs ログドライバーは、ログ情報を Amazon CloudWatch Logs に送信するように Fargate タスクを設定します。以下に、awslogs ログドライバーが設定されているタスク定義のスニペットを示します。

```
"logConfiguration": { 
   "logDriver": "awslogs",
   "options": { 
      "awslogs-group" : "/ecs/fargate-task-definition",
      "awslogs-region": "us-east-1",
      "awslogs-stream-prefix": "ecs"
}
```

##タスクストレージ
Fargate タスクでは、次のデータボリューム形式がサポートされています。

* EFS
* 非永続ストレージの場合エフェメラルストレージ。

##タスクとサービス
###タスクネットワーキング
> Fargate の Amazon ECS を使用するタスクでは、awsvpc ネットワークモードが必要です。これは各タスクに Elastic Network Interface を提供します。このネットワークモードを使用したタスクの実行またはサービスの作成時に、ネットワークインターフェイスにアタッチするサブネットを 1 つ以上、またはネットワークインターフェイスに適用するセキュリティグループを 1 つ以上、指定する必要があります。

パブリックサブネットを使用している場合は、ネットワークインターフェイスにパブリック IP アドレスを指定するかどうかを決定します。パブリックサブネットの Fargate タスクを使用してコンテナイメージをプルするには、タスクの Elastic Network Interface に、インターネットへのルートまたはリクエストをインターネットにルーティングできる NAT ゲートウェイを持つパブリック IP アドレスが割り当てられている必要があります。プライベートサブネット内の Fargate タスクでコンテナイメージをプルするには、リクエストをインターネットにルーティングするためにプライベートサブネットに NAT ゲートウェイがアタッチされている必要があります。

> awsvpc ネットワークモードを使用するタスクを含むサービス (例: 起動タイプが Fargate のサービス) では、Application Load Balancer および Network Load Balancer のみサポートされており、Classic Load Balancer はサポートされていません。また、このようなサービス用にターゲットグループを作成する場合は、ターゲットタイプとして instance ではなく、ip を選択する必要があります。これは、awsvpc ネットワークモードを使用するタスクは、Amazon EC2 インスタンスではなく、Elastic Network Interface に関連付けられているためです

###Fargate Spot
> Amazon ECS キャパシティープロバイダーを使用すると、Amazon ECS タスクで Fargate と Fargate Spot キャパシティーの両方を使用できます。

###Fargate タスクのリタイア
> AWS によりタスクをホストしている基盤のハードウェアで回復不可能な障害が検出されるか、セキュリティの問題がパッチ適用される必要がある場合、Fargate タスクのリタイアが予定されます。ほとんどのセキュリティパッチは、ユーザーの操作を必要とせずに、またはタスクを再起動する必要なく、透過的に処理されます。しかし、特定の問題については、タスクを再起動する必要があります。

予定されたリタイア日になると、タスクは AWS によって停止または終了されます。タスクがサービスの一部で、自動的に停止された場合、サービスのスケジューラにより、そのタスクを置き換える新しいタスクが開始されます。スタンドアロンタスクを使用する場合は、タスクのリタイアの通知が送信されます。詳細については、「タスクのリタイア」を参照してください。

###Fargate Savings Plans
> Savings Plans は、AWS の使用料金を大幅に削減できる料金モデルです。1〜3 年の期間、1 時間 につき USD 単位で一定の使用量を守ることにより、その使用に対する料金が低くなります。

###使用できる AWS Fargate プラットフォームのバージョン
* Fargate プラットフォームバージョン ‐ 1.4.0
    * 永続的なタスクストレージとして Amazon EFS ファイルシステムボリュームを使用するサポートを追加
    * エフェメラルタスクストレージを 20 GB に増加
    * タスクとの間のネットワークトラフィック動作を更新しました。プラットフォームバージョン 1.4 以降、すべての Fargate タスクは単一の Elastic Network Interface (タスク ENI と呼ばれる) を受け取り、すべてのネットワークトラフィックは VPC 内でこの ENI を通過し、VPC フローログを通じて表示されます。
    * CloudWatch Container Insights には、Fargate タスクのネットワークパフォーマンスメトリクスが含まれます。


###Amazon ECS タスク定義
> Amazon ECS で Docker コンテナを実行するには、タスク定義が必要です。以下に示しているのは、タスク定義で指定できるパラメータです。

* タスクの各コンテナで使用する Docker イメージ
* 各タスクで、またはタスク内の各コンテナで使用する CPU とメモリの量
* 使用する起動タイプ。この起動タイプにより、タスクをホストするインフラストラクチャが決定される
* タスクのコンテナで使用する Docker ネットワーキングモード
* タスクで使用するログ記録設定
* コンテナが終了または失敗した場合にタスクを実行し続けるかどうか
* コンテナの開始時に実行するコマンド
* タスクのコンテナで使用するデータボリューム
* タスクが使用する IAM ロール

####アプリケーションのアーキテクチャ
**Fargate 起動タイプを使用する場合**
> 以下の場合は、複数のコンテナを同じタスク定義に配置する必要があります。

* コンテナが同じライフサイクルを共有している (同時に起動および終了する必要がある).

* 実行基盤となるホストが同じになるようにコンテナを実行する (つまり、あるコンテナが、localhost ポート上の別のコンテナを参照する) 必要がある。

* コンテナにリソースを共有させる必要がある.

* コンテナでデータボリュームを共有している。

**EC2 起動タイプを使用する場合**

###networkmode
ECSでEC2インスタンスを利用する際のネットワークモードについて調べてみた
https://dev.classmethod.jp/articles/ecs-networking-mode/

##機密データの指定
> Amazon ECS を使用すると、AWS Secrets Manager シークレットまたは AWS Systems Manager パラメータストアのパラメータに機密データを保存してコンテナの定義でそれを参照することによって、コンテナに機密データを挿入できます。

以下の方法でシークレットをコンテナに公開できます。

* 機密データを環境変数としてコンテナに挿入するには、secrets コンテナ定義パラメータを使用します。

* コンテナのログ設定内の機密情報を参照するには、secretOptions コンテナ定義パラメータを使用します。

##Amazon ECS タスクのスケジューリング
> Amazon Elastic Container Service (Amazon ECS) は、タスクとコンテナの柔軟なスケジュール機能を提供する、共有状態のオプティミスティックな並列システムです。Amazon ECS スケジューラは Amazon ECS API から提供される同じクラスターの状態情報を利用して、適切な配置を決定します。

Fargate 起動タイプを使用する各タスクには独自の分離境界があり、基盤となるカーネル、CPU リソース、メモリリソース、または Elastic Network Interface は別のタスクと共有されません。

Amazon ECS には、サービススケジューラ (長期実行タスクおよびアプリケーション用に)、タスクを手動で実行する機能 (バッチジョブまたは単一実行タスク用)、および Amazon ECS でクラスターにタスクを配置する機能があります。また、タスク配置戦略と制約事項を指定できます。これにより、複数のアベイラビリティーゾーンに分散させるなど、選択した設定に基づいてタスクを実行できるようになります。さらに、カスタムのスケジューラやサードパーティー製スケジューラを統合することもできます。

###サービススケジューラ
> サービススケジューラは、長期実行するステートレスサービスおよびアプリケーションに適しています。サービススケジューラにより、指定したスケジュール戦略が順守され、タスクが失敗したときに (基盤となるインフラストラクチャに何らかの理由で障害が発生した場合などに) タスクが再スケジュールされます。

利用できる 2 つのサービススケジューラ戦略があります。
* REPLICA
    * レプリカスケジュール戦略では、クラスター全体で必要数のタスクを配置して維持します。デフォルトでは、サービススケジューラによってタスクはアベイラビリティーゾーン間で分散されます。タスク配置の戦略と制約を使用すると、タスク配置の決定をカスタマイズできます。
* DAEMON
    * デーモンのスケジュール戦略では、指定したすべてのタスク配置制約を満たすクラスター内のアクティブなコンテナインスタンスごとに、1 つのタスクのみをデプロイします。この戦略を使用する場合、タスクの必要数や配置戦略、サービスの Auto Scaling ポリシーを指定する必要はありません。
    * Fargate タスクは DAEMON スケジューリング戦略をサポートしていません。

###Amazon ECS デプロイタイプ
> Amazon ECS デプロイタイプは、サービスが使用するデプロイメント戦略を決定します。デプロイタイプには、ローリング更新、Blue/Green、外部の 3 つがあります。

* ローリング更新
* CodeDeploy を使用した Blue/Green デプロイ
* 外部デプロイ

####ローリング更新
> ローリング更新デプロイタイプは Amazon ECS により制御されます。これには、コンテナの現在実行されているバージョンを最新バージョンに置き換えるサービススケジューラも含まれます。ローリング更新中にサービスに対して Amazon ECS が追加または削除するタスク数は、デプロイ設定により制御されます。デプロイ設定はサービスデプロイメント中に許可されているタスクの最小数と最大数で構成されます。

####CodeDeploy を使用した Blue/Green デプロイ
> Blue/Green デプロイタイプでは、CodeDeploy によって制御される Blue/Green デプロイモデルを使用します。このデプロイタイプでは、本番稼働用トラフィックを送信する前にサービスの新しいデプロイメントを検証することができます。

Blue/Green デプロイ中にトラフィックを移行するには、次の 3 つの方法があります。

* Canary 
    * トラフィックを 2 回の増分で移行します。事前定義された複数の Canary オプションから選択し、最初の増分および間隔でトラフィックを更新済みタスクセットに移行する割合 (%) を分単位で指定できます。次に 2 回目の増分で残りのトラフィックを移行します。
* 線形
    * トラフィックを毎回、同じ増分、同じ間隔 (分) で移行します。事前定義された複数の線形オプションから選択し、増分ごとに移行するトラフィックの割合 (%) と増分間の間隔 (分) を指定できます。
* 一括
    * すべてのタスクを元のタスクセットから更新済みタスクセットに同時に移行します。