

# 使用策略来定义 Amazon ECS 任务放置
<a name="task-placement-strategies"></a>

对于使用 EC2 启动类型的任务，Amazon ECS 必须根据任务定义中指定的要求（例如 CPU 和内存）确定将任务放置在何处。同样，如果您缩减任务计数，Amazon ECS 必须确定终止哪些任务。您可以应用任务放置策略和约束，自定义 Amazon ECS 如何放置和终止任务。

原定设置任务放置策略取决于您是手动运行任务（独立任务）还是在服务中运行任务。对于作为 Amazon ECS 服务的一部分运行的任务，任务放置策略是使用 `attribute:ecs.availability-zone` 的 `spread`。对于不在服务中的任务，没有默认的任务放置约束。有关更多信息，请参阅 [在 Amazon ECS 上计划您的容器](scheduling_tasks.md)。

**注意**  
任务放置策略是尽力而为。Amazon ECS 仍会尝试放置任务，即使在大多数最优放置选项不可用时也是如此。但是，任务放置约束是绑定的，它们可能阻止任务放置。

您可以将任务放置策略与约束配合使用。例如，您可以使用任务放置策略和任务放置约束在多个可用区中分配任务，并根据每个可用区中的内存装填任务，但只针对 G2 实例。

Amazon ECS 放置任务时，使用以下流程选择容器实例：

1. 识别满足任务定义中对 CPU、GPU、内存和端口要求的容器实例。

1. 识别满足任务放置约束的容器实例。

1. 识别满足任务放置策略的容器实例。

1. 选择放置任务的容器实例。

使用 `placementStrategy` 参数在服务定义或任务定义中指定任务放置策略。

```
"placementStrategy": [
    {
        "field": "The field to apply the placement strategy against",
        "type": "The placement strategy to use"
    }
]
```

您可以在运行任务（[RunTask](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_RunTask.html)）、创建新服务（[CreateService](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_CreateService.html)）或更新现有服务（[UpdateService](https://docs.amazonaws.cn/AmazonECS/latest/APIReference/API_UpdateService.html)）时指定策略。

下表介绍了可用的类型和字段。


| 类型 | 有效的字段值 | 
| --- | --- | 
| binpack 将任务放置在容器实例上，以保留最少的未使用 CPU 或内存。此策略最大限度地减少了正在使用的容器实例的数量。 当使用此策略并执行横向缩减操作时，Amazon ECS 将终止任务。它根据任务终止后留在容器实例上的资源量执行此操作。任务终止后剩下可用资源最多的容器实例将终止该任务。 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 
| random 任务随机放置。 | 未使用 | 
| spread根据指定的值均匀放置任务。 服务任务根据该服务的任务分布。独立任务根据同一任务组中的任务分布。有关任务组的更多信息，请参阅 [与组相关的 Amazon ECS 任务](task-groups.md)。当使用 `spread` 策略并采取横向缩减行动时，Amazon ECS 将选择要终止的任务，以保持可用性区域之间的平衡。在可用区域内，将随机选择任务。 |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonECS/latest/developerguide/task-placement-strategies.html)  | 

也可以针对现有服务更新任务放置策略。有关更多信息，请参阅 [Amazon ECS 如何将任务放置在容器实例上](task-placement.md)。

您可以按照您希望的执行顺序创建策略阵列，从而创建使用多种策略的任务置放策略。例如，如果您想将任务分散到多个可用区，然后根据每个可用区内的内存装填任务，请指定可用区策略，然后指定内存策略。有关策略示例，请参阅 [Amazon ECS 任务放置策略示例](strategy-examples.md)。