

# Fargate 的 Amazon ECS 集群
<a name="fargate-capacity-providers"></a>

在 Amazon Fargate 容量提供程序上使用 Amazon ECS 使您能够将 Fargate 和 Fargate Spot 容量用于您的 Amazon ECS 任务。

使用 Fargate Spot，您可以按照与 Fargate 价格相比的折扣价格运行能够容忍中断的 Amazon ECS 任务。Fargate Spot 在备用计算容量上运行任务。当 Amazon 需要恢复容量时，您的任务将被中断，并发出两分钟的警告。

当使用 Fargate 和 Fargate Spot 容量提供程序的任务停止时，任务状态更改事件会发送到 Amazon EventBridge。停止原因说明了原因。有关更多信息，请参阅 [Amazon ECS 任务状态更改事件](ecs_task_events.md)。

集群可能同时包含 Fargate 容量提供程序和自动扩缩组容量提供程序。但是，容量提供程序策略只能包含 Fargate 容量提供程序或自动扩缩组容量提供程序，而不能同时包含两者。有关更多信息，请参阅[自动扩缩组容量提供程序](https://docs.amazonaws.cn/AmazonECS/latest/developerguide/cluster-auto-scaling.html#asg-capacity-providers)。

使用容量提供程序时，请考虑以下因素：
+ 您必须将容量提供程序与集群关联，然后才能将其与容量提供程序策略关联。
+ 您最多可以为容量提供程序策略指定 20 个容量提供程序。
+ 使用自动扩缩组容量提供程序的服务无法更新为使用 Fargate 容量提供程序，反之亦然。
+ 在容量提供程序策略中，如果未在控制台中为容量提供程序指定 `weight` 值，则使用原定设置值 `1`。如果使用 API或 Amazon CLI，则使用原定设置值 `0`。
+ 如果在容量提供程序策略中指定了多个容量提供程序，则至少有一个容量提供程序的权重值必须大于零。任何权重为 0 的容量提供程序都不能用于放置任务。如果您在策略中指定的多个容量提供程序的权重全部为 0，则使用该容量提供程序策略的任何 `RunTask` 或 `CreateService` 操作都将失败。
+ 在容量提供程序策略中，只能有一个容量提供程序定义了*基准值*。如果未指定基准值，则使用默认设置值零。
+ 集群可能同时包含自动扩缩组容量提供程序和 Fargate 容量提供程序。但是，容量提供程序策略只能包含自动扩缩组容量提供程序或 Fargate 容量提供程序，而不能同时包含两者。
+ 集群可能同时包含使用两个容量提供程序的服务和独立任务。服务可以更新为使用容量提供程序策略而不是启动类型。但是在执行此操作时必须强制实施新部署。

## Fargate Spot 终止通知
<a name="fargate-capacity-providers-termination"></a>

在需求极高的时期，Fargate Spot 容量可能会不可用。此操作可能会导致 Fargate Spot 任务被延迟。发生此情况时，Amazon ECS 服务会重试启动任务，直到所需容量变得可用为止。Fargate 不会将 Spot 容量替换为按需容量。

当使用 Fargate Spot 容量的任务因 Spot 中断而停止时，系统会在任务停止之前发送两分钟的警告。警告作为任务状态更改事件发送到 Amazon EventBridge 并作为 SIGTERM 信号发送到正在运行的任务。如果您在服务中使用 Fargate Spot，则在这种情况下，服务调度器将收到中断信号，并在有容量可用时尝试在 Fargate Spot 上启动额外任务。只有一个任务的服务将被中断，直到容量可用。有关正常关闭的更多信息，请参阅[使用 ECS 进行正常关闭](https://www.amazonaws.cn/blogs/containers/graceful-shutdowns-with-ecs/)。

为了确保容器在任务停止之前正常退出，您可以配置以下内容：
+ 可以在任务使用的容器定义中指定 `120` 秒或更小的 `stopTimeout` 值。默认 `stopTimeout` 值为 30 秒。您可以指定较长的 `stopTimeout` 值，为您在收到任务状态更改事件和强制停止容器的时间点之间留出更多时间。有关更多信息，请参阅 [容器超时](task_definition_parameters.md#container_definition_timeout)。
+ 必须从容器内接收 SIGTERM 信号才能执行任何清理操作。未能处理此信号将导致任务在配置的 `stopTimeout` 后接收 SIGKILL 信号，并可能导致数据丢失或损坏。

下面是任务状态更改事件的代码段。此代码段显示停止原因和 Fargate Spot 中断的停止代码。

```
{
  "version": "0",
  "id": "9bcdac79-b31f-4d3d-9410-fbd727c29fab",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "111122223333",
  "resources": [
    "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6f1cebef"
  ],
  "detail": {
    "clusterArn": "arn:aws:ecs:us-east-1:111122223333:cluster/default",
    "createdAt": "2016-12-06T16:41:05.702Z",
    "desiredStatus": "STOPPED",
    "lastStatus": "RUNNING",
    "stoppedReason": "Your Spot Task was interrupted.",
    "stopCode": "SpotInterruption",
    "taskArn": "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6fEXAMPLE",
    ...
  }
}
```

以下是用于为 Amazon ECS 任务状态更改事件创建 EventBridge 规则的事件模式。您可以选择在 `detail` 字段中指定集群。这样做意味着您将收到该集群的任务状态更改事件。有关创建 EventBridge 规则的更多信息，请参阅《Amazon EventBridge 用户指南》**中的 [Amazon EventBridge 入门](https://docs.amazonaws.cn/eventbridge/latest/userguide/eb-get-started.html)。

```
{
    "source": [
        "aws.ecs"
    ],
    "detail-type": [
        "ECS Task State Change"
    ],
    "detail": {
        "clusterArn": [
            "{{arn:aws:ecs:us-west-2:111122223333:cluster/default}}"
        ]
    }
}
```