

# Amazon ECS 上的 AWS Fargate 的任务停用和维护
<a name="task-maintenance"></a>

AWS 负责维护 AWS Fargate 的底层基础设施。AWS 确定何时需要将平台版本修订版替换为新的基础设施修订版。这称为任务停用。当平台版本版本修订停用时，AWS 会发送任务停用通知。我们会定期更新支持的平台版本以引入新版本，其中包含对 Fargate 运行时软件，以及底层依赖项（例如操作系统和容器运行时）的更新。提供较新修订版后，我们会停用旧版本，以确保所有客户工作负载均在最新修订版的 Fargate 平台版本上运行。当停用修订版时，系统会停用在该修订版上运行的所有任务。

Amazon ECS 任务可以分为服务任务和独立任务。服务任务作为服务的一部分进行部署，并由 Amazon ECS 计划控制。有关更多信息，请参阅 [Amazon ECS 服务](ecs_services.md)。独立任务是由 Amazon ECS `RunTask` API 直接启动或通过外部调度器启动的任务，例如计划任务（由 Amazon EventBridge 启动）、AWS Batch 或 AWS Step Functions。您不需要执行任何操作来响应服务任务的任务停用，因为 Amazon ECS 计划程序会自动替换这些任务。

对于独立任务，您可能需要执行额外处理来响应任务停用。有关更多信息，请参阅 [Amazon ECS 可以自动处理独立任务吗？](#task-retirement-standalone-tasks)。

对于服务任务，除非您想在 AWS 执行前替换这些任务，否则无需对任何停用执行任何操作。当 Amazon ECS 计划程序停止任务时，将使用 `maximumPercent` 并启动一个新任务，以尝试保持服务所需的任务数。遵循最佳实践，将任务停用的影响降至最低。对于使用 REPLICA 服务计划程序的服务，默认的 `maximumPercent` 值为 200%。因此，当 AWS Fargate 开始停用任务时，Amazon ECS 会首先安排一个新任务，然后等待其运行，然后再停用旧任务。将 `maximumPercent` 值设置为 100% 时，Amazon ECS 会首先停止任务，然后再将其替换。

对于独立任务停用，AWS 将在任务停用日期当天或之后停止任务。Amazon ECS 不会在任务停止时启动替换任务。如果您需要继续运行这些任务，则需要在通知中指示的时间之前停止正在运行的任务并启动替换任务。因此，我们建议客户监控独立任务的状态，并在需要时实施逻辑来替换已停止的任务。

在任何情景中停止任务时，您都可以运行 `describe-tasks`。响应中的 `stoppedReason` 是 `ECS is performing maintenance on the underlying infrastructure hosting the task`。

当有新的平台版本修订版并需要替换为新修订版时，任务维护适用。如果底层 Fargate 主机出现问题，则 Amazon ECS 会更换主机而不发出任务停用通知。

## 任务停用通知概述
<a name="task-retirement-notice"></a>

当 AWS 将平台版本修订版标记为需要停用时，我们会识别所有区域中该平台版本修订版上运行的所有任务。

下图显示了 Fargate 平台版本修订版的生命周期（从新修订版发布到平台修订版停用）。

![\[该图显示了 Fargate 任务停用生命周期。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/fargate-task-retirement.png)


下面的信息提供了详细信息。
+ 新的平台版本修订版发布后，所有新任务均安排在此修订版上。
+ 已安排并正在运行的现有任务将在任务持续期间保留在最初放置它们的修订版上，不会迁移到新的修订版。
+ 新任务（如作为服务更新或 Fargate 任务停用的一部分）将置于发布时可用的最新平台版本修订版上。

任务停用通知通过 AWS Health Dashboard 以及通过电子邮件发送到注册的电子邮件地址，包含以下信息：
+ 任务停用日期：任务在此日期或之后停止。
+ 对于独立任务，任务的 ID。
+ 对于服务任务，运行服务的集群 ID 和服务 ID。
+ 您需要采取的后续步骤。

通常，我们会针对每个 AWS 区域 中的服务和独立任务各发送一条通知。但是，在某些情况下，每种任务类型可能会收到多个事件。例如，有太多要停用的任务，将超出我们通知机制中的限制时。

通过以下方式，您可以确定计划停用的任务：
+ 这些区域有：Health Dashboard

  您可以通过 Amazon EventBridge 将 AWS Health 通知发送到存档存储器（例如 Amazon Simple Storage Service）、执行自动操作（例如运行 AWS Lambda 函数）或其他通知系统（例如 Amazon Simple Notification Service）。有关更多信息，请参阅[使用 Amazon EventBridge 监控 AWS Health 事件](https://docs.aws.amazon.com/health/latest/ug/cloudwatch-events-health.html)。有关向 Amazon Chime、Slack 或 Microsoft Teams 发送通知的示例配置，请参阅 GitHub 上的 [AWS Health Aware](https://github.com/aws-samples/aws-health-aware) 存储库。

  以下是一个示例 EventBridge 事件。

  ```
  {
      "version": "0",
      "id": "3c268027-f43c-0171-7425-1d799EXAMPLE",
      "detail-type": "AWS Health Event",
      "source": "aws.health",
      "account": "123456789012",
      "time": "2023-08-16T23:18:51Z",
      "region": "us-east-1",
      "resources": [
          "cluster|service",
          "cluster|service"
      ],
      "detail": {
          "eventArn": "arn:aws:health:us-east-1::event/ECS/AWS_ECS_TASK_PATCHING_RETIREMENT/AWS_ECS_TASK_PATCHING_RETIREMENT_test1",
          "service": "ECS",
          "eventScopeCode": "ACCOUNT_SPECIFIC",
          "communicationId": "7988399e2e6fb0b905ddc88e0e2de1fd17e4c9fa60349577446d95a18EXAMPLE",
          "lastUpdatedTime": "Wed, 16 Aug 2023 23:18:52 GMT",
          "eventRegion": "us-east-1",
          "eventTypeCode": "AWS_ECS_TASK_PATCHING_RETIREMENT",
          "eventTypeCategory": "scheduledChange",
          "startTime": "Wed, 16 Aug 2023 23:18:51 GMT",
          "endTime": "Fri, 18 Aug 2023 23:18:51 GMT",
          "eventDescription": [
              {
                  "language": "en_US",
                  "latestDescription": "\\nA software update has been deployed to Fargate which includes CVE patches or other critical patches. No action is required on your part. All new tasks launched automatically uses the latest software version. For existing tasks, your tasks need to be restarted in order for these updates to apply. Your tasks running as part of the following ECS Services will be automatically updated beginning Wed, 16 Aug 2023 23:18:51 GMT.\\n\\nAfter Wed, 16 Aug 2023 23:18:51 GMT, the ECS scheduler will gradually replace these tasks, respecting the deployment settings for your service. Typically, services should see little to no interruption during the update and no action is required. When AWS stops tasks, AWS uses the minimum healthy percent (1) and launches a new task in an attempt to maintain the desired count for the service. By default, the minimum healthy percent of a service is 100 percent, so a new task is started first before a task is stopped. Service tasks are routinely replaced in the same way when you scale the service or deploy configuration changes or deploy task definition revisions. If you would like to control the timing of this restart you can update the service before Wed, 16 Aug 2023 23:18:51 GMT, by running the update-service command from the ECS command-line interface specifying force-new-deployment for services using Rolling update deployment type. For example:\\n\\n$ aws ecs update-service -service service_name \\\n--cluster cluster_name -force-new-deployment\\n\\nFor services using Blue/Green deployment type with AWS CodeDeploy:\\nPlease refer to create-deployment document (2) and create new deployment using same task definition revision.\\n\\nFor further details on ECS deployment types, please refer to ECS Deployment Developer Guide (1).\\nFor further details on Fargate's update process, please refer to the AWS Fargate User Guide (3).\\nIf you have any questions or concerns, please contact AWS Support (4).\\n\\n(1) https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\n(2) https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html\\n(3) https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-maintenance.html\\n(4) https://aws.amazon.com/support\\n\\nA list of your affected resources(s) can be found in the 'Affected resources' tab in the 'Cluster/ Service' format in the AWS Health Dashboard. \\n\\n"
              }
          ],
        "affectedEntities": [
                  {
                      "entityValue": "arn:aws:ecs:eu-west-1:111222333444:task/examplecluster/00805ce1d81940b5a37398e5a2c23333"
                  },
                  {
                      "entityValue": "arn:aws:ecs:eu-west-1:111222333444:task/examplecluster/00805ce1d81940b5a37398e5a2c25555"
                  }
              }
          ]
      }
  }
  ```
+ 电子邮件

  将向注册的电子邮件发送一封电子邮件以获取 AWS 账户 ID。

有关如何准备任务停用的信息，请参阅 [为 Amazon ECS 上的 AWS Fargate 任务停用做准备](prepare-task-retirement.md)。

## 我能否选择退出任务停用？
<a name="task-retirement-opt-out"></a>

否。作为 AWS 责任共担模式的一部分，AWS 负责管理和维护 AWS Fargate 的底层基础设施。这包括定期执行平台更新以确保安全性和稳定性。这些更新由 AWS 自动应用，客户无法选择退出。与在 EC2 实例上运行工作负载相比，使用 AWS Fargate 的一个主要优势是，维护底层平台的责任由 AWS 承担。此模型可让您专注于应用程序而非基础设施维护。通过自动应用这些平台更新，AWS 能够使 Fargate 环境保持最新和安全，而无需您作为客户采取任何行动。这有助于为在 Fargate 上运行工作负载提供可靠且安全的容器化环境。

## 我可以通过其他 AWS 服务获取任务停用通知吗？
<a name="task-retirement-event"></a>

AWS 向 Health Dashboard 和 AWS 账户 上的主要电子邮件联系人发送任务停用通知。Health Dashboard 提供了与其他 AWS 服务（包括 EventBridge）的许多集成。您可以使用 EventBridge 自动显示通知（例如，将消息转发到 ChatOps 工具）。有关更多信息，请参阅 [Solution overview: Capturing task retirement notifications](https://aws.amazon.com/blogs/containers/improving-operational-visibility-with-aws-fargate-task-retirement-notifications/)。

## 我可以在任务停用计划后更改任务停用吗？
<a name="task-retirement-change"></a>

 不可以。该计划基于任务停用等待时间（默认为 7 天）。如果您需要更多时间，则可以选择将等待期配置为 14 天。有关更多信息，请参阅 [步骤 2：获取任务停用通知以提醒团队并采取行动](prepare-task-retirement.md#prepare-task-retirement-capture-task-events)。

自 2025 年 12 月 18 日起，Amazon ECS 允许您为 Fargate 任务配置 [Amazon EC2 事件窗口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html)。如果需要精确控制任务停用的确切时间（例如，将任务安排在周末以避免在工作时间中断），则可以为任务、服务或集群配置 Amazon EC2 事件窗口，请参阅[步骤 1：设置任务等待时间或使用 Amazon EC2 事件窗口](prepare-task-retirement.md#prepare-task-retirement-set-time)。请注意，此配置的更改适用于将来计划的停用。目前已计划的停用不受影响。此外，当您为 Fargate 任务配置 Amazon EC2 事件窗口时，它优先于您的任务停用等待时间配置。如有任何疑问，请联系 支持。

## Amazon ECS 如何处理属于服务一部分的任务？
<a name="task-retirement-service-works"></a>

对于服务任务，除非您想在 AWS 执行前替换这些任务，否则无需执行任何操作来响应任何停用。当 Amazon ECS 计划程序停止任务时，其使用最小正常百分比并启动一个新任务，以尝试保持服务所需的任务数。为了最大限度地降低 Fargate 任务停用的影响，应按照 Amazon ECS 最佳实践部署工作负载。例如，当将无状态应用程序部署为 Amazon ECS 服务（如 Web 或 API 服务器）时，客户应该部署多个任务副本并将 minimumHealthyPercent 设置为 100%。 默认情况下，服务的最小正常运行状况百分比为 100%。因此，当 Fargate 开始停用任务时，Amazon ECS 会首先安排一个新任务并等待其运行，然后再停用旧任务。当您扩展服务、部署配置更改或部署任务定义修订版时，服务任务会以相同的方式作为任务停用的一部分进行例行替换。要为任务停用流程做准备，请参阅 [为 Amazon ECS 上的 AWS Fargate 任务停用做准备](prepare-task-retirement.md)。

## Amazon ECS 可以自动处理独立任务吗？
<a name="task-retirement-standalone-tasks"></a>

 不可以。AWS 无法为通过 `RunTask`、计划任务（例如通过 EventBridge 调度器）、AWS Batch 或 AWS Step Functions 启动的独立任务创建替换任务。Amazon ECS 仅管理属于服务一部分的任务。

## 在任务停用期间排查服务可用性问题
<a name="task-retirement-service-availability"></a>

如果 Amazon ECS 在任务停用期间无法启动替换任务，则您的服务可用性可能受到影响。这可能因客户配置不正确所致，例如：
+ IAM 角色缺失或配置错误
+ 目标子网中容量不足
+ 安全组配置错误
+ 任务定义错误

当 Amazon ECS 无法启动替换任务时，停用的任务将被停止，而不会进行替换操作，这会降低您的服务可用容量，并有可能导致服务中断。监控服务的任务计数和 Amazon CloudWatch 指标，以确保在事件停用期间成功启动替换任务。

# 为 Amazon ECS 上的 AWS Fargate 任务停用做准备
<a name="prepare-task-retirement"></a>

要为任务停用做准备，请执行下面的操作：

1. 设置任务停用等待期或使用 Amazon EC2 事件窗口。

1. 捕获任务停用通知以通知团队成员。

1. 您可以通过使用 force-deployment 选项更新服务，确保所有服务的任务都在最新的平台版本上运行。此为可选步骤。

## 步骤 1：设置任务等待时间或使用 Amazon EC2 事件窗口
<a name="prepare-task-retirement-set-time"></a>

 您可以通过两种账户设置选项来配置 Fargate 启动任务停用的时间：`fargateTaskRetirementWaitPeriod` 和 `fargateEventWindows`。

**更新 fargateTaskRetirementWaitPeriod 账户设置**

您可以对 Fargate 开始停用任务的时间进行配置。默认等待期为 7 天。对于需要立即应用更新的工作负载，请选择即时设置（`0`）。如果需要更多时间，请配置 `7` 或 `14` 天选项。

建议您选择较短的等待时间，以便更快获得较新的平台版本修订版。

通过以根用户或管理员用户身份运行 `put-account-setting-default` 或 `put-account-setting` 配置等待期。将 `fargateTaskRetirementWaitPeriod` 选项用于设置为以下值之一的 `name` 和 `value` 选项：
+ `0`：AWS 发送通知，并立即开始停用受影响的任务。
+ `7`：AWS 发送通知，等待 7 个日历日后才开始停用受影响的任务。这是默认值。
+ `14`：AWS 发送通知，等待 14 个日历日后才开始停用受影响的任务。

有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [put-account-setting-default](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting-default.html) 和 [put-account-setting](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting.html)。

**使用 fargateEventWindows 账户设置**

自 2025 年 12 月 18 日起，Amazon ECS 允许您为 Fargate 任务配置 [Amazon EC2 事件窗口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html)。如果需要精确控制任务停用的确切时间（例如，将任务安排在周末以避免在工作时间中断），则可以为任务、服务或集群配置 Amazon EC2 事件窗口。

当您使用事件窗口时，Fargate 会确保您的任务运行至少 3 天，之后才会在下一个可用窗口中停用，除非任务因用户启动的操作或关键运行状况事件（例如底层硬件性能下降）而停止。

将 `fargateEventWindows` 账户设置设置为 `enabled`。您可以以根用户或管理用户身份使用以下任一 API：`put-account-setting-default` 或 `put-account-setting`。

 每个 Amazon EC2 事件窗口每周必须打开至少 4 小时，每个时间范围必须至少为 2 小时。对于大型集群和服务，我们建议配置持续时间较长（8 小时或更长）或时间范围更频繁（至少每 3 天发生一次）的事件窗口。您可以在[用户指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html#event-windows-considerations)中进一步查看 Amazon EC2 事件窗口的注意事项。AWS Fargate 会确保您的任务运行至少 3 天，之后才会停用，除非任务因用户启动的操作或关键运行状况事件（例如底层硬件性能下降）而停止。

**重要**  
在事件窗口内替换任务将尽力而为。如果发现任务在您的事件窗口之外停用，请考虑延长持续时间（8 小时或更长时间）或增加频率（至少每 3 天一次）。

要将 Amazon EC2 事件窗口应用于 Fargate 任务停用，请执行下面的操作：
+ 将 `fargateEventWindows` 账户设置设置为 `enabled`。您可以以根用户或管理用户身份使用以下任一 API：`put-account-setting-default` 或 `put-account-setting`。请注意，这是对 Fargate 任务使用 Amazon EC2 事件窗口功能的一次性启用操作。
+ 通过 AWS 管理控制台或 AWS CLI 创建 Amazon EC2 事件窗口。要使用 CLI 创建事件窗口，请使用带有时间范围或 cron 表达式的 EC2 `create-instance-event-window` API。记下响应中的 `InstanceEventWindowId`。

  ```
  aws ec2 create-instance-event-window \
                      --time-range StartWeekDay=monday,StartHour=2,EndWeekDay=wednesday,EndHour=8 \
                      --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                      --name myEventWindowName
  ```

  或者，您可以在创建 EC2 事件窗口时使用 cron 表达式。

  ```
  aws ec2 create-instance-event-window \
                      --cron-expression "* 21-23 * * 2,3" \
                      --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                      --name myEventWindowName
  ```
+ 然后，您可以使用 EC2 `associate-instance-event-window` API 将事件窗口与账户中的特定服务、集群或所有任务相关联。
  + 对于 ECS 服务任务

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:serviceArn,Value=your-service-arn}]"
    ```
  + 对于 ECS 集群

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:clusterArn,Value=your-cluster-arn}]"
    ```
  + 将事件窗口与账户中的所有任务相关联

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:fargateTask,Value=true}]"
    ```

您可以使用多个键值对，将一个事件窗口与多个服务或集群相关联。

Fargate 将按照以下顺序为每个任务选择事件窗口：
+ 如果存在与任务的服务关联的事件窗口，则将使用该窗口。这不适用于独立任务或非托管式任务。
+ 如果存在与任务的集群关联的事件窗口，则将使用该窗口。
+ 如果为所有 Fargate 任务设置了事件窗口，则将使用该窗口。
+ 如果没有事件窗口与任务匹配，则将使用 `fargateTaskRetirementWaitPeriod` 设置。

**配置 Fargate 任务维护的事件窗口**

假设您在 Fargate 上运行多个具有不同可用性要求的 ECS 服务。您想要精确控制任务停用。您可以按如下方式配置多个事件窗口：
+ **所有 Fargate 任务的默认维护：**为非高峰时段（每天凌晨 12 点至 4 点）的例行维护创建一个事件窗口，然后使用 ` aws:ecs:fargateTask` 标签将其与所有 Fargate 任务相关联。
+ **开发集群的仅周末维护**：对于具有可以容忍周末中断的服务的开发集群，请创建一个 24 小时周末窗口（周六和周日、全天），然后使用带有集群 ARN 的 `aws:ecs:clusterArn` 标签将其与集群关联。
+ **任务关键型服务的受限窗口**：对于工作日需要较长正常运行时间的任务关键型支付处理服务，请将维护限制在周末清晨（周六和周日凌晨 12 点至 4 点），然后使用带有服务 ARN 的 `aws:ecs:serviceArn` 标签将其与特定服务相关联。

在此配置中，支付服务使用其特定仅限周末的窗口，开发集群服务和任务使用周末 24 小时窗口，所有其他 Fargate 任务使用默认每天维护时段。

有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [put-account-setting-default](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting-default.html) 和 [put-account-setting](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting.html)。

## 步骤 2：获取任务停用通知以提醒团队并采取行动
<a name="prepare-task-retirement-capture-task-events"></a>

当即将有任务停用时，AWS 会向 AWS Health Dashboard 和 AWS 账户 上的主要电子邮件联系人发送任务停用通知。AWS Health Dashboard 提供了与其他 AWS 服务（包括 Amazon EventBridge）的许多集成。您可以使用 EventBridge 从任务停用通知构建自动化，例如通过将消息转发到 ChatOps 工具来提高即将进行的停用的可见性。AWS HealthAware 是一种资源，它展示了 AWS Health Dashboard 的强大功能以及如何在整个组织中分发通知。您可以将任务停用通知转发到一个聊天应用程序（如 Slack）。

下图显示了解决方案概述。

![\[该图显示了用于捕获 Fargate 任务停用通知的 Fargate 解决方案。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/fargate-task-retirement-solution.png)


下面的信息提供了详细信息。
+ Fargate 将任务停用通知发送到 AWS Health Dashboard。
+ AWS Health Dashboard 将邮件发送到 AWS 账户 上的主要电子邮件联系人，并通知 EventBridge。
+ EventBridge 有一条捕获停用通知的规则。

  该规则查找具有以下事件详细信息类型的事件：`"AWS Health Event" and the Event Detail Type Code: "AWS_ECS_TASK_PATCHING_RETIREMENT"`
+ 该规则会触发一个 Lambda 函数，其使用 Slack Incoming Webhook 将信息转发到 Slack。有关更多信息，请参阅 [Incoming Webhooks](https://slack.com/marketplace/A0F7XDUAZ-incoming-webhooks)。

有关代码示例，请参阅 Github 上的 [Capturing AWS Fargate Task Retirement Notifications](https://github.com/aws-samples/capturing-aws-fargate-task-retirement-notifications/tree/main)。

## 步骤 3：控制任务的替换
<a name="prepare-task-retirement-change-time"></a>

您无法控制任务停用的确切时间，但是可以定义等待时间。如果想按自己的计划控制替换任务，则可以捕获任务停用通知以首先了解任务停用日期。然后，您可以重新部署服务以启动替换任务，并同样替换任何独立任务。对于使用滚动部署的服务，可以在停用开始时间之前使用 `update-service` 和 `force-deployment` 选项更新服务。

以下 `update-service` 示例使用 `force-deployment` 选项。

```
aws ecs update-service —-service service_name \ 
    --cluster cluster_name \
     --force-new-deployment
```

对于使用蓝/绿部署的服务，您需要在 AWS CodeDeploy 中创建新部署。有关如何创建部署的信息，请参阅《AWS Command Line Interface Reference》**中的 [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。