亚马逊AWS官方博客

通过 AWS Fargate 任务停用通知改善运营监控能力

AWS Fargate 是面向容器化工作负载的无服务器计算引擎,消除了保护底层基础设施以及为其打补丁过程中的无差别繁重工作。在这篇博文中,我们将深入探讨 AWS Fargate 任务停用功能,这是 AWS 用来确保基础设施安全以及应用了最新补丁的一种方法。

AWS 近期更新了 AWS Fargate 任务停用流程,在其中整合了通知功能,以便用户接收有关即将进行的停用的通知,并推出一种机制,让客户可以控制从发出通知到任务停用之间的时间。在这篇博文中,我们将更详细地探讨这些变化,并举例说明如何使用这些通知来实现卓越运营

背景

在 AWS Fargate 上部署 Amazon Elastic Container Service(Amazon ECS)任务时,需要在 Amazon ECS 服务或独立任务 API 调用中指定平台版本。平台版本是指主机操作系统的运行时系统环境,即内核和容器运行时系统的组合。平台版本中存在一种内部构造,称为平台版本修订。平台版本修订是不可变的,随着运行时系统环境的发展发布新修订,例如,在推出了内核错误修复或安全更新时。每次在 AWS Fargate 上计划运行新任务时,该任务始终会在指定平台版本的最新修订上启动。

随着时间的推移,对于为正在运行的任务提供支持的现有平台版本修订,AWS 可能会决定停用某个修订。在停用某个修订时,AWS Fargate 将停止在该修订上运行的所有任务。导致某个修订需要停用的原因可能有很多,包括安全漏洞和性能改进。过去,AWS Fargate 每个月会停用一到两个平台版本修订,但是一个特定的平台版本修订并没有固定的支持期。由于平台版本修订的典型生命周期,与一个任务需要运行几个星期的客户相比,工作负载运行时间较短的客户遇到的任务停用的次数会少得多。

platform_version_revision_lifecycle

上图显示了 AWS Fargate 平台版本修订的完整生命周期。新的平台版本修订发布之后,所有新任务都会计划在此修订上运行。对于已经计划并正在运行的现有任务,在任务期间,会保持其最初所使用的修订,不迁移到新修订。如果任务被替换,例如在 ECS 服务更新期间或由于 AWS Fargate 任务停用,则新任务将使用在任务启动时可用的最新平台版本修订。

任务停用

下图显示了 AWS Fargate 任务停用的端到端流程。

task_retirement_process

当 AWS 将某个平台版本修订标记为需要停用时,我们会在所有 AWS 区域中,确定运行在该平台版本修订上的所有任务。然后,我们会向每个区域的每个账户发送通知,强调受影响的任务或服务以及开始进行停用的日期。该通知通过电子邮件发送给 AWS 账户的主要电子邮件联系人,并且还会发送到 AWS Health Dashboard。发送到 AWS Health Dashboard 的通知,可以通过 Amazon EventBridge 转发到 AWS 服务或第三方工具

在通知发送后,如果客户希望控制 AWS Fargate 启动自动任务停用流程所间隔的确切时间,则客户可以获得一段时间(称为任务停用等待期)来采取手动操作。AWS Fargate 停止一项任务时,如果任务包含在某个 ECS 服务中,则将根据服务的 minimumHealthyPercent 值来停止任务。对于独立任务,应由客户负责监控正在运行任务的状态和启动替换。

为了尽可能减少 AWS Fargate 任务停用的影响,应按照 Amazon ECS 最佳实践部署工作负载。例如,将无状态应用程序部署为 Amazon ECS 服务(例如 Web 服务器或 API 服务器)时,客户应部署多个任务副本并将 minimumHealthyPercent 设置为 100%。这样,当 AWS Fargate 开始停用任务时,Amazon ECS 将首先计划一项新任务并等待其状态进入正在运行,然后再停用旧任务。

有关任务退出流程的更多信息,请参阅 AWS Fargate 文档

任务停用等待期

现在,您可以使用新 Amazon ECS AccountSetting 中的 fargateTaskRetirementWaitPeriod 来设置任务停用等待期的时间长度。在 AWS Fargate 根据任务停用来停止任务之前,客户可以使用任务停用等待期来按照自己的计划停止任务,例如,在他们的工作负载只能在特定时段内停止时。

任务停用等待期可以配置为下表中设置的时间间隔之一。我们倾向于建议尽可能缩短等待期,以便尽快使用新的平台版本修订。

天数 操作
0 AWS 发送通知并立即开始停用受影响的任务。
7 AWS 发送通知,然后等待 7 个日历日后才开始停用受影响的任务。
14 AWS 发送通知,然后等待 14 个日历日后才开始停用受影响的任务。

虽然关键安全更新极少出现,但在遇到这种情况时,AWS Fargate 可能会覆盖此任务停用等待期,发送任务停用通知并立即停用受影响的任务。这相当于将 fargateTaskRetirementWaitPeriod 设置为 0

现有 fargateTaskRetirementWaitPeriod 值可以通过 aws ecs list-account-settings 命令查看。

$ aws ecs list-account-settings \
    --name fargateTaskRetirementWaitPeriod \
    --effective-settings
{
    "settings": [
        {
            "name": " fargateTaskRetirementWaitPeriod",
            "value": "14",
            "principalArn": "arn:aws:iam::123456789012:root"
        }
    ]
}

fargateTaskRetirementWaitPeriod 可以使用 aws ecs put-account-setting-default 命令来配置。

$ aws ecs put-account-setting-default \
    --name fargateTaskRetirementWaitPeriod \
    --value 14

有关任务停用等待时间的更多信息,请参阅任务停用Amazon ECS AccountSetting 文档。

解决方案概述:捕获任务停用通知

在即将进行任务停用时,AWS 会向 AWS Health Dashboard 以及 AWS 账户中的主要电子邮件联系人发送任务停用通知。AWS Health Dashboard 提供了多种与其他 AWS 服务的集成,包括 Amazon EventBridge。利用 Amazon EventBridge,客户可以从任务停用通知构建自动化操作,例如将消息转发到 ChatOps 工具,从而更好的监控即将到来的停用。

AWS Health Aware 是一个很好的资源,可以充分展示 AWS Health Dashboard 的强大功能,以及如何在整个企业中分发通知。在本演练中,我们根据此项目给出的灵感,将任务停用通知转发给聊天应用程序 Slack。EventBridge 规则使用 Event Detail Type: "AWS Health Event"Event Detail Type Code: "AWS_ECS_TASK_PATCHING_RETIREMENT" 语句来捕获通知。规则在捕获到通知后,将触发一个 AWS Lambda 函数,该函数解析受影响资源的事件,并将其转发到 Slack 传入 Webhook

下图显示了此解决方案的高级架构。

task_retirement_notifications_walkthrough_architecture

先决条件

要完成本演练,需要满足以下先决条件:

  • 现有的 Slack 工作区,且安装并启用了传入 Webhook Slack 应用程序
  • 具有相关权限的 AWS 账户,用于部署 Amazon EventBridge 规则和 AWS Lambda 函数。
  • 在本地开发工作站上安装和配置了 AWS SAM CLI

解决方案演练

  1. 演练的示例代码存储在 GitHub 存储库中。本演练的第一步是将存储库克隆到本地开发工作站。
$ git clone https://github.com/aws-samples/capturing-aws-fargate-task-retirement-notifications.git
$ cd capturing-aws-fargate-task-retirement-notifications

  1. 接下来,我们构建并部署 Lambda 函数和 EventBridge 规则(在 AWS SAM 模板 cloudformation.yaml 中定义)。请注意,您需要在部署向导中输入参数,包括您的 Slack 工作区 URI 和 Slack 频道。
$ sam build --template cloudformation.yaml 
$ sam deploy --guided
Configuring SAM deploy
======================

     Looking for config file [samconfig.toml] :  Not found

    Setting default arguments for 'sam deploy'
    ============================================================
    Stack Name [sam-app]: FargateTaskRetirementNotifications
    AWS Region [eu-west-1]: eu-west-1
    Parameter SlackWorkspaceURL []: https://hooks.slack.com/services/workspace/app/token
    Parameter SlackChannel []: platform-eng
    #显示您的资源更改待部署,需要输入“Y”来启动部署
    Confirm changes before deploy [y/N]: y
    #SAM 需要权限以创建角色,用于连接到您模板中的资源
    Allow SAM CLI IAM role creation [Y/n]:        
    #在操作失败时,保留之前所预置资源的状态
    Disable rollback [y/N]: 
    Save arguments to configuration file [Y/n]: 
    SAM configuration file [samconfig.toml]: 
    SAM configuration environment [default]:

  1. 测试一下! 此处我们向 Amazon EventBridge 发送了两个示例事件,以验证所有功能正常运行。由于我们无法模拟 AWS Health 通知,因此改为创建与 EventBridge 规则相匹配的 EventBridge 事件,利用事件来触发工作流。示例存储库中有两个事件,一个事件用于附加到 Amazon ECS 服务的任务,另一个用于独立任务。
$ aws events put-events --entries file://sample_service_event.json
$ aws events put-events --entries file://sample_task_event.json

  1. 在您的 Slack 区中,现在应该显示两个 Slack 通知,每个测试事件对应一个通知。

task_retirement_slack_1

task_retirement_slack_2

清理

要清理示例演练,请使用 AWS SAM CLI,通过 with $ sam delete 命令删除 CloudFormation 堆栈

总结

在这篇博文中,我们深入探讨了 AWS Fargate 任务停用流程。然后演示了在客户想要控制从发送通知到停用之间的时间时,如何调整任务停用等待期。最后,我们演示了客户如何使用 Amazon EventBridge 和 AWS Lambda 获取任务停用通知。要了解有关 AWS Fargate 任务停用的更多信息,请参阅 AWS Fargate 文档