3
2

タスク配置戦略とは?

image.png
デフォルトのタスク配置戦略は、タスクを手動 (スタンドアロンタスク) で実行するのか、それともサービス内で実行するのかによって異なります。Amazon ECS サービスの一部として実行されるタスクの場合、タスク配置戦略は attribute:ecs.availability-zone を使用した spread です。

例題

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

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

解答例

Amazon Elastic Container Service (Amazon ECS) を使用します。ターゲット追跡スケーリングを使用するように Amazon ECS Service Auto Scaling を設定します。最小容量を 3 に設定します。タスク配置戦略タイプをアベイラビリティーゾーン属性で分散するように設定します。

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

項目 説明
Placement Strategy (配置戦略)
spread インスタンスを複数のアベイラビリティーゾーンに均等に配置する。
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 タスク配置戦略の例

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

次の戦略は、アベイラビリティーゾーン間でタスクを均等に分散します。

"placementStrategy": [
    {
        "field": "attribute:ecs.availability-zone",
        "type": "spread"
    }
]

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

次の戦略は、すべてのインスタンス間でタスクを均等に分散します。

"placementStrategy": [
    {
        "field": "instanceId",
        "type": "spread"
    }
]

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

次の戦略はメモリに基づいてタスクをビンパックします。

"placementStrategy": [
    {
        "field": "memory",
        "type": "binpack"
    }
]

詳細は、こちら
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/strategy-examples.html

ECSタスク定義における配置戦略と制約条件がわかる具体的な例

この例では、タスクの配置を最適化するために、インスタンスの特定の属性や条件に基づいてタスクを配置する制約条件と、タスクを広く分散させたり、リソースを効率的に利用したりするための配置戦略が定義されています。

{
  "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" タスクグループに属さないタスクを配置するように指定されています。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2