

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

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

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

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

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

使用容量提供程序时，请考虑以下因素：
+ 您必须将容量提供程序与集群关联，然后才能将其与容量提供程序策略关联。
+ 您最多可以为容量提供程序策略指定 20 个容量提供程序。
+ 使用自动扩缩组容量提供程序的服务无法更新为使用 Fargate 容量提供程序，反之亦然。
+ 在容量提供程序策略中，如果未在控制台中为容量提供程序指定 `weight` 值，则使用原定设置值 `1`。如果使用 API或 AWS 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://aws.amazon.com/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.aws.amazon.com/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"
        ]
    }
}
```

# 为 Fargate 工作负载创建 Amazon ECS 集群
<a name="create-cluster-console-v2"></a>

创建一个集群来定义要在其上运行任务和服务的基础设施。

开始之前，请确保您已完成 [设置以使用 Amazon ECS](get-set-up-for-amazon-ecs.md) 中的步骤，然后分配相应的 IAM 权限。有关更多信息，请参阅 [Amazon ECS 集群示例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。Amazon ECS 控制台通过创建 CloudFormation 堆栈来创建 Amazon ECS 集群所需的资源。

该控制台自动将 Fargate 和 Fargate Spot 容量提供程序与集群关联。

您可以修改以下选项：
+ 将命名空间添加到集群。

  命名空间允许您在集群中创建的服务无需额外配置即可连接到命名空间中的其他服务。有关更多信息，请参阅 [互连 Amazon ECS 服务](interconnecting-services.md)。
+ 启用任务事件以接收 EventBridge 任务状态更改通知。
+ 添加标签以帮助您识别集群。
+ 为托管存储分配 AWS KMS 密钥。有关如何创建密钥的信息，请参阅《*AWS Key Management Service 用户指南*》中的 [Create a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
+ 为您的 Fargate 临时存储空间分配一个 AWS KMS 密钥。有关如何创建密钥的信息，请参阅《*AWS Key Management Service 用户指南*》中的 [Create a KMS key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)。
+ 为 ECS Exec 配置 AWS KMS 密钥和日志记录。

## 过程
<a name="create-cluster-console-v2-procedure"></a>

**要创建新集群（Amazon ECS 控制台）**

1. 在 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2) 打开控制台。

1. 从导航栏中，选择要使用的区域。

1. 在导航窗格中，选择**集群**。

1. 在 **Clusters**（集群）页面上，选择 **Create cluster**（创建集群）。

1. 在**集群配置**下，配置以下内容：
   + 对于**集群名称**，输入唯一的名称。

     该名称最多可以包含 255 个字母（大小写字母）、数字和连字符。
   + （可选）要使 Service Connect 使用的命名空间与集群名称不同，请在 **Service Connect 默认值**下的**默认命名空间**中选择或输入命名空间名称。要使用共享的命名空间，请选择或输入命名空间 ARN。有关如何使用共享命名空间的更多信息，请参阅 [使用共享 AWS Cloud Map 命名空间的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)。

1. （可选）使用 Container Insights 时，请展开**监控**，然后选择下列选项之一：
   + 要按照建议使用具有增强型可观测性的 Container Insights，请选择**具有增强型可观测性的 Container Insights**。
   + 要使用 Container Insights，请选择 **Container Insights**。

1. （可选）要启用任务事件，请展开**任务事件**，然后开启**启用任务事件**。

   启用任务事件后，Amazon ECS 会将任务状态更改事件发送到 EventBridge。这样，您就可以自动监控和响应任务生命周期更改。

1. （可选）要使用 ECS Exec 调试集群中的任务，请展开**问题排查配置**，然后配置以下内容：
   + （可选）对于 **ECS Exec 的 AWS KMS 密钥**，请输入要用于加密 ECS Exec 会话数据的 AWS KMS 密钥的 ARN。
   + （可选）对于 **ECS Exec 日志记录**，请选择日志目的地：
     + 要向 CloudWatch Logs 发送日志，请选择 **Amazon CloudWatch**。
     + 要将日志发送到 Amazon S3，请选择 **Amazon S3**。
     + 要禁用日志记录，请选择**无**。

1. （可选）在**加密**下，您可以配置以下参数：
   + 加密 Fargate 临时存储上的数据。在**加密**下，对于 **Fargate 临时存储**，输入要用于加密 Fargate 临时存储数据的 AWS KMS 密钥的 ARN。
   + 加密托管式存储上的数据。在**加密**下，对于**托管存储**，输入要用于加密托管存储数据的 AWS KMS 密钥的 ARN。

1. （可选）为了帮助识别您的集群，请展开**标签**，然后配置您的标签。

   [添加标签] 选择 **Add tag**（添加标签），然后执行以下操作：
   + 对于 **Key**（键），输入键名称。
   + 对于**值**，输入键值。

   [删除标签] 选择标签的“键”和“值”右侧的**Remove**（删除）。

1. 选择**创建**。

## 后续步骤
<a name="fargate-cluster-next-steps"></a>

创建集群后，您可以针对应用程序创建任务定义，然后将其作为独立任务或服务的一部分运行。有关更多信息，请参阅下列内容：
+ [Amazon ECS 任务定义](task_definitions.md)
+ [将应用程序作为 Amazon ECS 任务运行](standalone-task-create.md)
+ [创建 Amazon ECS 滚动更新部署](create-service-console-v2.md)