コンテナの配置戦略と制約条件

タスク配置戦略とは？
--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/e22673c7-b43f-03e7-482e-1b58d8521e7d.png)
<font color="red">**デフォルトのタスク配置戦略**</font>は、タスクを手動 (スタンドアロンタスク) で実行するのか、それともサービス内で実行するのかによって異なります。<font color="red">**Amazon ECS サービスの一部として実行されるタスクの場合、タスク配置戦略は attribute:ecs.availability-zone を使用した spread です。**</font>



https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/bestpracticesguide/bestpracticesguide.pdf

例題
--
ある企業は、コンテナ化されたアプリケーションのワークロードを 3 つのアベイラビリティーゾーンにわたる VPC にデプロイしたいと考えています。同社は、<font color="red">**アベイラビリティーゾーン全体で可用性の高いソリューション**</font>を必要としています。ソリューションでは、アプリケーションへの変更を最小限に抑える必要があります。

運用オーバーヘッドを最小限に抑えながらこれらの要件を満たすソリューションを提示して下さい。

解答例
--
 Amazon Elastic Container Service (Amazon ECS) を使用します。ターゲット追跡スケーリングを使用するように Amazon ECS Service Auto Scaling を設定します。最小容量を 3 に設定します。<font color="red">**タスク配置戦略タイプをアベイラビリティーゾーン属性で分散**</font>するように設定します。
 
 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-placement-strategies.html

コンテナの配置戦略と制約条件
--

| 項目               | 説明                                                     |
|-------------------|----------------------------------------------------------|
| **Placement Strategy (配置戦略)** |                                                          |
| <font color="red">**spread**</font>            | <font color="red">**インスタンスを複数のアベイラビリティーゾーンに均等に配置する。**</font> |
| binpack           | リソースの使用率が最も高いアベイラビリティーゾーンにタスクを配置する。(CPU,MEMORY) |
| random            | ランダムな選択に基づいてタスクを配置する。                      |
| **Placement Constraints (配置制約)** |                                                          |
| distinctInstance | 同一インスタンス上に複数の同じタイプのタスクを配置しない。        |
| memberOf          | 特定の属性や条件を持つインスタンスにタスクを配置する。          |
| **制約条件の具体例**                |                                                          |
| attribute:ecs.instance-type != t2.micro | インスタンスタイプが t2.micro でないインスタンスにタスクを配置する。 |
| attribute:ecs.availability-zone == us-east-1a | 特定のアベイラビリティーゾーンにタスクを配置する。              |

Amazon ECS タスク配置戦略の例
--

複数のアベイラビリティーゾーンでタスクを均等に分散する

次の戦略は、アベイラビリティーゾーン間でタスクを均等に分散します。
```json
"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]
```

すべてのインスタンスでタスクを均等に分散する

次の戦略は、すべてのインスタンス間でタスクを均等に分散します。
```json
"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    }
]
```


メモリに基づいてタスクをビンパックする

次の戦略はメモリに基づいてタスクをビンパックします。
```json
"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]
```
詳細は、こちら
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/strategy-examples.html


ECSタスク定義における配置戦略と制約条件がわかる具体的な例
--
この例では、タスクの配置を最適化するために、インスタンスの特定の属性や条件に基づいてタスクを配置する制約条件と、タスクを広く分散させたり、リソースを効率的に利用したりするための配置戦略が定義されています。
```json
{
  "family": "example-task",
  "containerDefinitions": [
    {
      "name": "example-container",
      "image": "example-image:latest",
      "cpu": 256,
      "memory": 512,
      "essential": true
    }
  ],
  "placementConstraints": [
    {
      "type": "memberOf",
      "expression": "attribute:ecs.instance-type != t2.micro"
    },
    {
      "type": "distinctInstance"
    }
  ],
  "placementStrategy": [
    {
      "type": "spread",
      "field": "instanceId"
    },
    {
      "type": "binpack",
      "field": "memory"
    }
  ]
}
```

- **配置戦略**
  - `spread` インスタンスIDに基づいてタスクを広く分散させます。
  - `binpack` メモリ使用量が高いインスタンスにタスクを配置します。

- **制約条件**
  - `memberOf` インスタンスタイプが t2.micro でないインスタンスにタスクを配置します。
  - `distinctInstance` 同じインスタンス上に複数の同じタイプのタスクを配置しないようにします。

AWS CLIを使用してECSでタスクを実行する
--
__異なるタスクグループに属するタスクを異なるインスタンスに配置するために使用例__
1つ目のコマンドは特定のタスクグループ（ここでは "webserver"）に所属するタスクを配置するように指示しています。2つ目のコマンドは、タスクグループが "webserver" でない場合にタスクを配置するように指示しています。

1つ目のコマンド

```
aws ecs run-task --cluster ecs-demo --task-definition myapp --count 5 --placement-constraints type=memberOf,expression="task:group == webserver"
```

このコマンドは、"webserver" タスクグループに属するタスクを配置するように指定されています。

2つ目のコマンド

```
aws ecs run-task --cluster ecs-demo --task-definition myapp --count 5 --placement-constraints type=memberOf,expression="not=(task:group == webserver)"
```

このコマンドは、"webserver" タスクグループに属さないタスクを配置するように指定されています。