👋

Amazon ECSのタスクIDからECSクラスタを特定するスクリプト

2022/01/27に公開

ECSクラスタ名を知りたい

先日 [Retirement Notification] Amazon ECS (Fargate) task scheduled for termination という件名のメールがAWSから来ました。ホストしている基盤が劣化しているために一部のFargateタスクを終了するよという内容です。以下に一部を抜粋します。

Dear Amazon ECS customer,

We have time-sensitive information that may affect your applications for your account (AWS Account ID: 123456789012).

We have detected degradation of the underlying infrastructure hosting your Fargate task (Task-ID: arn:aws:ecs:ap-northeast-1:123456789012:task/abcdefghijklmnopqrstuv1234567890) in the ap-northeast-1 region. Due to this degradation, your task could already be unreachable. After Wed, X Feb 2022 YY:MM:SS GMT, your task will be terminated.

このタスクID arn:aws:ecs:ap-northeast-1:123456789012:task/abcdefghijklmnopqrstuv1234567890 がどこのECSクラスタで動いているのかがメール文面からわかりません。

describe-tasks コマンドでECSタスクを調べることができますが、--cluster オプションを指定しない場合はデフォルトクラスタを指定されるため、ECSクラスタがわからないと調べることができません。

$ aws ecs describe-tasks --tasks arn:aws:ecs:ap-northeast-1:123456789012:task/abcdefghijklmnopqrstuv1234567890
{
    "tasks": [],
    "failures": [
        {
            "arn": "arn:aws:ecs:ap-northeast-1:123456789012:task/abcdefghijklmnopqrstuv1234567890",
            "reason": "MISSING"
        }
    ]
}

そこでECSクラスタ一覧を取得し、ECSタスクが存在するかを1つずつチェックすることでECSクラスタを調べることにしました。

スクリプト

シェルスクリプトを置いておきます。AWS CLIjqが必要です。

# search_ecs_cluster.sh
#!/bin/bash -u

task_id=$1
clusters=$(aws ecs list-clusters --query 'clusterArns' --output text)

for cluster_arn in $(aws ecs list-clusters --query 'clusterArns' --output text)
do
  tasks=$(aws ecs describe-tasks --cluster $cluster_arn --tasks $task_id --query 'tasks' 2> /dev/null)
  if [ $? -ne 0 ]; then
    continue
  fi
  if [ $(echo $tasks | jq '. | length') -gt 0 ]; then
    echo "Cluser: $(echo $cluster_arn | sed -e 's/^arn.*:cluster\/\(.*\)$/\1/')"
    echo "Service: $(echo $tasks | jq -r '.[].group' | sed -e 's/^service:\(.*\)$/\1/')"
    break
  fi
done

実行する場合はECSタスクIDを引数に指定します。

# ARNを指定する場合
$ ./search_ecs_cluster.sh arn:aws:ecs:ap-northeast-1:123456789012:task/abcdefghijklmnopqrstuv1234567890

# タスクIDのみを指定する場合
$ ./search_ecs_cluster.sh abcdefghijklmnopqrstuv1234567890

Cluser: foo_cluster
Service: bar_service

Discussion