タスク配置戦略とは?
デフォルトのタスク配置戦略は、タスクを手動 (スタンドアロンタスク) で実行するのか、それともサービス内で実行するのかによって異なります。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" タスクグループに属さないタスクを配置するように指定されています。