

# 为 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)。