为 Amazon ECS 上的 Amazon Fargate 任务停用做准备 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 Amazon ECS 上的 Amazon Fargate 任务停用做准备

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

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

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

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

步骤 1:设置任务等待时间或使用 Amazon EC2 事件窗口

您可以通过两种账户设置选项来配置 Fargate 启动任务停用的时间:fargateTaskRetirementWaitPeriodfargateEventWindows

更新 fargateTaskRetirementWaitPeriod 账户设置

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

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

通过以根用户或管理员用户身份运行 put-account-setting-defaultput-account-setting 配置等待期。将 fargateTaskRetirementWaitPeriod 选项用于设置为以下值之一的 namevalue 选项:

  • 0:Amazon 发送通知,并立即开始停用受影响的任务。

  • 7:Amazon 发送通知,等待 7 个日历日后才开始停用受影响的任务。这是默认值。

  • 14:Amazon 发送通知,等待 14 个日历日后才开始停用受影响的任务。

有关更多信息,请参阅《Amazon Elastic Container Service API 参考》中的 put-account-setting-defaultput-account-setting

使用 fargateEventWindows 账户设置

自 2025 年 12 月 18 日起,Amazon ECS 允许您为 Fargate 任务配置 Amazon EC2 事件窗口。如果需要精确控制任务停用的确切时间(例如,将任务安排在周末以避免在工作时间中断),则可以为任务、服务或集群配置 Amazon EC2 事件窗口。

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

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

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

重要

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

要将 Amazon EC2 事件窗口应用于 Fargate 任务停用,请执行下面的操作:

  • fargateEventWindows 账户设置设置为 enabled。您可以以根用户或管理用户身份使用以下任一 API:put-account-setting-defaultput-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-defaultput-account-setting

步骤 2:获取任务停用通知以提醒团队并采取行动

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

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

该图显示了用于捕获 Fargate 任务停用通知的 Fargate 解决方案。

下面的信息提供了详细信息。

  • Fargate 将任务停用通知发送到 Amazon Health Dashboard。

  • Amazon Health Dashboard 将邮件发送到 Amazon Web Services 账户 上的主要电子邮件联系人,并通知 EventBridge。

  • EventBridge 有一条捕获停用通知的规则。

    该规则查找具有以下事件详细信息类型的事件:"AWS Health Event" and the Event Detail Type Code: "AWS_ECS_TASK_PATCHING_RETIREMENT"

  • 该规则会触发一个 Lambda 函数,其使用 Slack Incoming Webhook 将信息转发到 Slack。有关更多信息,请参阅 Incoming Webhooks

有关代码示例,请参阅 Github 上的 Capturing Amazon Fargate Task Retirement Notifications

步骤 3:控制任务的替换

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

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

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

对于使用蓝/绿部署的服务,您需要在 Amazon CodeDeploy 中创建新部署。有关如何创建部署的信息,请参阅《Amazon Command Line Interface Reference》中的 create-deployment