Amazon ECSの概要

今回はECSについて理解を深めていきたいと思います。
https://qiita.com/Blago518/items/7ec3fff329a164abc5d3

## Amazon ECSとは

#### フルマネージドコンテナサービス

- オーケストレーション
    - コンテナのデプロイ、スケジューリング、スケーリング
- ミドルウェアへのパッチ、アップグレード、セキュリティ対応不要
- 他のAWSサービスとのネイティブな統合
- ログ、メトリクス、イベントを最初からサポート
- グローバルに利用可能で、パフォーマンスが高く、スケーラブル
- 追加料金不要

#### コンテナ実行環境の選択肢

-ECSはコントロールプレーンとしての役割をもち、データプレーンであるAmazon EC2やAWS Fargateで実行される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/2fb6259d-0eb5-4cd8-9a2c-375c782ce1aa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/92997440-aa24-4e27-8175-5659a915fde3.png)

## コンテナ実行環境の差異

#### ECS on EC2

- 利用者が管理するレイヤー
    - アプリケーションコンテナ
    - ホストのスケーリング
    - コンテナエージェント設定
    - ホストOS / ライブラリ設定
- 特徴
    - コンテナホストを自由に選択、設定できる
        - CPU、メモリ、ディスク、OS、バージョンなど
        - ネットワークモードの選択（外部接続しない、ホストのネットワークを利用、ENIへのアタッチなど）
        - 柔軟なデータボリューム利用
- 課題
    - コンテナホストの管理が必要
        - OSやエージェント類へのパッチあてや更新
        - EC2インスタンス数のスケーリング
- Amazon ECS on Fargateで解決できる
- コンテナホストがマネージドになるため、トレードオフがある

#### ECS on Fargate

- 利用者が管理するレイヤー
    - アプリケーションコンテナ
- AWSが提供するレイヤー
    - ホストのスケーリング
    - コンテナエージェント設定
    - ホストOS / ライブラリ設定

## Amazon ECSの構成要素

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/1f3b95cf-e0f5-415f-9f2b-0568359486d2.png)

## タスク定義 / タスク

- コンテナ(群)の実行単位**定義**
    - タスクとしてのまとまりを所定の**JSON書式**で定義したもの
        - (例) Front-endサービス、Back-endサービス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/999744b1-fbe9-4d6a-9d30-1a08ba9b3a7a.png)

- **スタンドアロンタスク** or **サービス**によって、タスク定義から起動される
    - 1つ以上のコンテナを実行するリソース
    - タスク内のコンテナ群は必ず同じホスト上で実行
    - 1つのタスク定義は最大10コンテナ指定可能

#### 代表的なパラメータ

- 必須
    - ファミリー（family）：タスク定義の名前
    - コンテナ定義（containerDefinitions）：コンテナのイメージ/ポートマッピング/メモリ制限などを指定
- オプション
    - タスクサイズ（cpu / memory）：タスクが使用するCPUとメモリの合計値
    - タスクロール（taskRoleArn）：コンテナが利用できるIAMロールを指定
    - タスク実行ロール（executionRoleArn）：ECSコンテナエージェントが利用するIAMロールを指定
    - ネットワークモード（networkMode）：awsvpc、bridge、default、none
    - ボリューム（volumes）：Fargateバインドマウント、EBSボリューム、EFSボリューム、Dockerボリューム、EC2バインドマウントの5種類が利用可能

#### ネットワークモード

- awsvpc
    - 各タスクに個別のIPアドレス(ENI)が付与される
    - ポート競合なし
    - SGはタスクごとに設定可能
    - **Fargate**で必須のモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/c3a72e11-adc4-464e-a809-3e9b050efbe4.png)

- bridge
    - EC2のENIを共有し、内部で仮想IPを振り分けて利用
    - ポートマッピングが必要（-p 8080:5000のように）
    - 複数のコンテナで同じポート番号を使える
    - SGはEC2単位で設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/22d7a08b-c06c-4713-b7c0-3a8df4429867.png)

- host
    - コンテナがホストと同じIP、同じポートを共有
    - ポート競合が起きやすい
    - 高速通信向け
    - SGはEC2単位で設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4088727/aa41c340-f699-4cb5-9bba-e8642a7d2536.png)

#### ボリューム

- Fargateバインドマウント
    - Fargateのみで利用可能
    - 揮発性のストレージをコンテナにマウントし、コンテナ間で共有
    - 使用するすべてのコンテナが停止するとデータが削除される
        - 一時ファイルの保存などを目的とする場合に適している
- Amazon EBSボリューム
    - Fargate、EC2で利用可能
    - ブロックストレージ型の永続ボリューム
    - タスクごとに1つのEBSボリュームにアタッチ可能
        - 高スループットなトランザクション集約型アプリケーション向け
- Amazon EFSボリューム
    - Fargate、EC2で利用可能
    - タスク終了後もデータは永続で保持される
    - 複数のECSタスクやコンテナで共有可能で、容量は自動で拡張、縮小される
        - ログ共有、マルチAZ間のデータ保存に最適
- Dockerボリューム
    - EC2のみで利用可能
    - ライフサイクルはタスク定義やDockerの設定による
    - タスク間でデータ共有が可能
    - 3rd Party（外部）のボリュームドライバーを利用可能（EFS/EBS）
        - 軽量なデータ保持、シンプルな共有に便利
- EC2バインドマウント
    - EC2のみで利用可能
    - ホストマシン上のファイルやディレクトリをコンテナにマウント
    - コンテナはホストのライフサイクルに依存

## サービス

- タスク実行コピー数（n個）を定義
- 起動後、タスク実行コピー数を維持
- ELBと連携
- 起動タイプ（EC2/Fargate）を設定

## クラスター

- 実行環境の境界
- IAM権限の境界（クラスターに対する操作）
- スケジュールされたタスクの実行を設定可能

## コンテナの実行方法

#### スタンドアロンタスク

- タスク定義に従って実行されるアプリケーションの実行単位
- タスク定義の一部のパラメータはタスク実行時に上書き可能
- メインのコンテナが終了するとタスクも停止
    - 用途：バッチジョブなど処理が終わると停止するワークロードなど

#### サービス

- 指定したタスクの数を維持する
- タスクが停止/失敗した場合は新しいタスクを起動して置き換え
    - 用途：Webアプリケーションなど長時間実行するワークロード
- ELBとの連携 / Auto Scaling機能

#### タスク数のAuto Scaling

1.ターゲット追跡スケーリングポリシー
- 指定したメトリクスが、ターゲットの値に近づくように自動調整

2.ステップスケーリングポリシー
- アラームをトリガーに、調整池に基づいて増減
- ターゲット追跡スケーリングポリシーと組み合わせることでより高度なスケーリングも可能

3.スケジューリング 
- 日付と時刻に基づいてタスク数を増減

#### Capacity Providers

- Capacity Providers
    - タスクが実行されるインフラストラクチャを設定
    - Auto ScalingグループやFargateを指定
    - Fargateキャパシティプロバイダーは予約済み
        - Fargate
        - Fargate Spot
- Capacity Provider Strategy
    - タスクをどのキャパシティプロバイダーに配置するかを決定する「戦略」
    - ベース値やウェイト値で配置を細かく制御可能

## まとめ

Flask、Docker、AWS Fargateでのアプリ実装はしてみたものの、
設定値や挙動を深く理解するためにより多くの実践したいと思います。