Amazon Web Services ブログ

Amazon ECS のタスク定義が削除できるようになりました

この記事は Announcing Amazon ECS Task Definition Deletion (記事公開日: 2023 年 2 月 27 日) の翻訳記事です。

本日、Amazon Elastic Container Services (Amazon ECS) の新機能である、タスク定義のリビジョンの削除を発表できることを嬉しく思います。これまではタスク定義のリビジョンを登録解除すると、ListTaskDefinition API コールやAmazon ECS コンソールに表示されなくなるだけで、INACTIVE であるタスク定義のリビジョンを選択するように特別に選択した場合はこの限りではありませんでした。この新機能により、お客様は不要になったタスク定義のリビジョンや望ましくない構成を含むタスク定義のリビジョンを完全に削除できます。これにより、リソース管理が簡素化され、セキュリティ体制が強化されます。

はじめに

タスク定義は、Amazon ECS でタスクとサービスを実行するための設計図として機能します。お客様はタスク定義を更新して新しいリビジョンを作成したり、不要になった古いリビジョンを登録解除したりできます。登録解除されたタスク定義のリビジョンは、Amazon ECS によって INACTIVE とマークされ、新しいサービスの作成やスタンドアロンタスクの実行には使用できません。登録解除することにより、お客様は INACTIVE であるタスク定義のリビジョンを意識しなくてよい一方で、時間の経過とともにこれらのリソースは積み重なる可能性があります。お客様からは、次のような理由により、タスク定義の管理に問題があるというフィードバックをいただきました。

  • 機密情報の扱い
  • 多数のタスク定義のリビジョンにより、リソースの数が煩雑になる

ウォークスルー

タスク定義削除機能の使用方法

本日より、新しい DeleteTaskDefinition API を使用してタスク定義のリビジョンを削除したり、INACTIVE なリビジョンを削除したりできるようになりました。これは、使い慣れた AWS コマンドラインインターフェイス (AWS CLI)、AWS Cloud Development Kit (AWS CDK)、および AWS SDK を使用して実行できます。AWS コンソールでタスク定義の削除を行うには、こちらの手順を参照してください。

Amazon ECS では、新しいタスクやサービスの起動に使用したくないタスク定義を登録解除できます。そのためには、登録解除タスク定義の API コールを使用します。

AWS CLI で次のコマンドを実行して、状態が INACTIVE のすべてのタスク定義を一覧表示します。

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

登録解除が必要なアクティブなタスク定義のリビジョンがある場合は、次のコマンドを実行します。

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

AWS コンソールを使用して、1 つのタスク定義のリビジョンを登録解除できます。登録解除するリビジョンが数百または数千ある場合は、スクリプトを使用してこれらの操作をバッチ処理する方がよいでしょう。

次のスクリプトを使用すると、これらの操作の管理をスケールできます。このスクリプトには、TASKNAME、START、END の 3 つの変数が必要です。TASKNAME は、登録解除するタスク定義ファミリーの名前です。START は、登録解除を行うループを開始したい最初のタスク定義のリビジョンです。END は、ループを停止させたい最後のタスク定義のリビジョンです。たとえば、スクリプトを使用して START=1624 と END=1854 を設定して 1624 から 1854 までのすべてのタスク定義のリビジョンを登録解除したり、START=1、END=1000 に設定して最初の 1000 件のタスク定義のリビジョンを削除したりできます。

このスクリプトは、ループを実行してタスク定義のリビジョンを反復処理しますが、API スロットリングの issue が発生しないように 5 秒のスリープを挟んで登録解除を実行します。

#!/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

AWS CLI を使用して 1 つのタスク定義のリビジョンを削除する方法を見てみましょう。

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

タスク定義のリビジョンが削除されると、そのリビジョンは INACTIVE 状態から DELETE_IN_PROGRESS に移行します。これが実際に動作していることを確認するには、DescribeTaskDefintion API を使用するか、次のコマンドを実行します。

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

次のスクリプトを使用して、登録解除操作と削除操作の両方を 1 つのスクリプトにまとめることもできます。

#!/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 サービスが中断されることなく稼働し、可用性の基準を満たしていることが確認できます。

前提条件

  • AWS Account
  • AWS CLI

まとめ

この記事では、不要になったタスク定義や望ましくない構成を含むタスク定義のリビジョンをお客様が完全に削除する方法を説明しました。これによりリソース管理が簡素化され、セキュリティ体制が改善されます。AWS CLI で 1 つのタスク定義のリビジョンを登録解除して削除する例を紹介し、複数のタスク定義のリビジョンを削除したいお客様向けに一括削除スクリプトを紹介しました。

タスク定義の削除は、GitHub ロードマップで最も要望の多かった ECS 機能の 1 つです。これを皆さんにお届けできることを嬉しく思います。この先、Amazon ECS はお客様がタスク定義リソースを大規模に管理するための、よりスマートで自動化されたメカニズムを提供する予定です。私達はタスク定義のライフサイクルポリシーの導入を予定しています。このポリシーを使用して、お客様がタスク定義リソースの登録解除と削除を自動化するルールを定義できます。たとえば、お客様は 180 日以上使用されていないタスク定義のリビジョンを自動的に登録解除し、90 日以上使用されていないタスク定義のリビジョンを削除するルールを定義できます。Github の issue に関するフィードバックをお待ちしています。

翻訳はソリューションアーキテクトの加治が担当しました。原文はこちらです。