宣布删除 Amazon ECS 任务定义

今天,我们很高兴地宣布亚马逊弹性容器服务 (Am azon ECS ) 中的新功能允许您删除任务定义修订。到目前为止,您只能 取消注册 任务定义修订版,除非您特别选择选择处于非活动状态的任务定义修订版,否则它将不再显示在您的 ListTaskDefinition API 调用或 Amazon ECS 控制台中。借助这项新功能,客户可以永久删除不再需要或包含不良配置的任务定义修订,从而简化资源管理并改善安全状况。

简介

任务定义可用作在 Amazon ECS 上运行任务和服务的蓝图。客户可以更新任务定义以创建新的修订版本,并取消注册不再需要的旧版本。已取消注册的任务定义修订被 Amazon ECS 标记为非活动,不能用于创建新服务或运行独立任务。尽管取消注册使客户更容易忽略不活跃的任务定义修订,但随着时间的推移,这些资源可能会堆积起来。我们的客户向我们反馈说,由于以下原因,管理任务定义存在问题:

  • 敏感信息(例如,可以删除并以文本格式暴露的秘密)
  • 大量的任务定义修订使资源数量变得混乱

草率排练

如何使用新的删除任务定义功能

从今天开始,你现在可以使用新的 DeleteTaskDefinition API 删除任务修订版,也可以删除非活动修订版。您可以使用 亚马逊云科技 命令行接口 (AW S CLI)、 A WS 云开发套件 ( 亚马逊云科技 CDK ) 和您熟悉的 亚马逊云科技 开发工具包来完成此操作。要在 亚马逊云科技 控制台中执行此操作,请查看 此处 的说明

使用 Amazon ECS,您可以取消注册不想用于启动新任务或服务的任务定义。 你可以使用 deregisterTaskDefinition API 调 用来做到这一点。

在您的 亚马逊云科技 CLI 中运行以下命令以列出所有状态为 INACTIVE 的任务定义。

aws ecs list-task-definitions --status INACTIVE --no-cli-pager

如果您有有效的任务版本需要取消注册,请运行以下命令:

aws ecs deregister-task-definition --task-definition <task name:revision>  

您可以使用 亚马逊云科技 控制台取消注册单个任务定义修订版。如果你有成百上千个修订版本需要注销,那么最好使用脚本来批处理这些操作。

以下脚本可用于大规模管理这些操作。该脚本需要三个变量:任务名称、开始和结束。TASKNAME 是要取消注册的任务定义系列的名称。START 是您希望取消注册循环开始的第一个任务定义修订版。END 是您希望循环停止的最后一个任务定义修订版。例如,您可以使用脚本通过设置 START=1624 和 END=1854 来删除 1624 到 1854 年之间的所有任务修订版本,也可以通过设置 START=1 和 END=1000 来删除前 1000 个任务定义修订版本

该脚本执行循环并遍历任务定义修订版,在两者之间休眠 5 秒钟后取消注册,以确保您不会遇到任何 API 限制问题。

#!/bin/bash -ex

TASKNAME=<task name>
START=1 # the first number of the task revision to loop through
END=1000 # The last number to stop the delete loop at

for (( x=$START; x<=$END; x++ ))
do
        aws ecs deregister-task-definition --task-definition $TASKNAME:$x --no-cli-pager
        sleep 5
        echo "The task $TASKNAME and revision $x has been deregistered"
done

让我们来看看您将如何使用 亚马逊云科技 CLI 删除单个任务定义修订版。

aws ecs delete-task-definitions --task-definitions <task name:revision>

下面我们有一个自动执行删除任务定义修订操作的脚本,它使用与取消注册脚本相同的逻辑,具有相同的变量 TASKNAME、START 和 END。

#!/bin/bash -ex

TASKNAME=<task name>
START=1 # the first number of the task revision to loop through
END=1000 # The last number to stop the delete loop at

for (( y=$START; y<=$END; x++ ))
do
        aws ecs delete-task-definitions --task-definitions $TASKNAME:$y --no-cli-pager
        sleep 5
        echo "The task $TASKNAME and revision $x has been deleted"
done

删除任务定义修订版本后,它将从 “非活动” 状态转换为 DELETE_IN_PROGRESS。要实际看到这一点,我们使用 describeTaskDefintion API 或运行以下命令。

aws ecs describe-task-definition --task-definition <task name:revision>  

您也可以使用以下脚本将取消注册和删除操作合并到一个脚本中。

#!/bin/bash -ex

TASKNAME=<task name>
START=1 # the first number of the task revision to loop through
END=1000 # The last number to stop the delete loop at

# This function will deregister the task definition
for (( x=$START; x<=$END; x++ ))
do
        aws ecs deregister-task-definition --task-definition $TASKNAME:$x --no-cli-pager
        sleep 5
        echo "The task $TASKNAME and revision $x has been deregistered"
done

# This function will delete the task definition
for (( y=$START; y<=$END; y++ ))
do
        aws ecs delete-task-definitions --task-definitions $TASKNAME:$y --no-cli-pager
        sleep 5
        echo "The task $TASKNAME and revision $y has been deleted"
done

要跟踪删除状态,您可以使用以下命令检索标记为删除的任务定义修订版本列表:

aws ecs list-task-definitions --status DELETE_IN_PROGRESS --no-cli-pager

在我们的测试中,使用上面的脚本完成 DELETE_IN_PROGRESS 过程花了 30-60 分钟。ECS 任务定义是至关重要的资源,可以由正在运行的任务以及各种 ECS 组件引用,从而为客户提供高可用性和更快的性能。因此,ECS 异步删除任务定义修订版,以确保您的 ECS 服务继续运行并满足其可用性标准,而不会受到任何干扰。

先决条件

  • 亚马逊云科技 账户
  • 亚马逊云科技 命令行

结论

在这篇文章中,我们展示了客户如何永久删除不再需要或包含不良配置的任务定义修订,从而简化资源管理并改善安全状况。我们向您介绍了使用 亚马逊云科技 CLI 取消注册和删除单个任务定义修订版的示例,并为想要删除多个任务定义修订版的客户分享了一个批量删除脚本。

任务定义删除一直 是我们 GitHub 路线图 上最受欢迎的 ECS 功能之一 ,我们很高兴将其带给您。将来,Amazon ECS将为客户提供更智能、更自动化的机制来大规模管理其任务定义资源。我们计划引入任务定义生命周期策略,客户可以使用这些策略来定义规则,以自动注销和删除其任务定义资源。例如,客户将能够定义规则,自动注销已超过 180 天未使用的任务定义版本,并删除 90 天以上未使用和处于非活动状态的任何任务定义版本。我们期待听到你对 Github 问题的 反馈