👋

AWS CLI で取得した ECS (on Fargate) タスクのレスポンスから実行結果を確認する

2024/06/13に公開

弊社ではバックエンド API のデプロイパイプラインの中で、データベースのマイグレーションを実施しています。マイグレーションは AWS の CodeBuild から ECS on Fargate タスク(以下 ECS タスク)として実行しています。ECS タスクのレスポンスからマイグレーションの実行結果を確認するにあたって、似たようなパラメータがいくつかあり、どれを確認すればよいのか迷ったため、以下に簡単にまとめておきます。

マイグレーション用 CodeBuild では、AWS CLI の ecs describe-tasks コマンドで ECS タスクの実行結果を取得しています。ECS タスクの実行結果で確認したかったポイントは大きく以下の2つです。

  • コンテナが正常に起動したか
  • コマンドが正常に実行されたか

これらを確認するために、ECS タスクのレスポンスでは以下の 4 つのパラメータをチェックすればよいことがわかりました。[1]

  • tasks[] > stopCode(以下 stopCode
  • tasks[] > stopReason(以下 stopReason
  • tasks[] > containers[] > exitCode(以下 exitCode
  • tasks[] > containers[] > reason(以下 reason

コンテナが正常に起動したかは stopCodestopReason を確認します。

  • stopCode にはコンテナが停止した理由を示すコードが設定されますが、必ずしもエラーコードというわけではありません。[2]

  • stopReason には具体的な停止理由が設定される場合があります。特にstopCode にエラーコードが設定されている場合は確認が必要です。[3]
    コマンドが正常に実行されたかは exitCodereason を確認します。

  • exitCode が 0 の場合、コマンドは正常に終了しています。それ以外の値の場合は、何らかの問題が発生したことを示しています。[4]

  • reason には具体的なエラーメッセージが設定されている場合があります。

これらを踏まえて、マイグレーション用 CodeBuild では以下のように ECS タスクの実行結果をハンドリングしています。

while true; do
  RESPONSE=$(aws ecs describe-tasks \
    --cluster $ECS_BACKEND_DB_MIGRATION_CLUSTER_ARN \
    --tasks $TASK_ARN)
  
  STOP_CODE_EXISTS=$(echo $RESPONSE | jq '.tasks[0] | has("stopCode")')
  TASK_STATUS=$(echo $RESPONSE | jq -r '.tasks[0].lastStatus')
  
  if [[ "$STOP_CODE_EXISTS" == "false" ]]; then
    echo "現在の DB マイグレーションタスクのステータス: $TASK_STATUS"
    sleep 10
    continue
  fi

  STOP_CODE=$(echo $RESPONSE | jq -r '.tasks[0].stopCode')
  STOP_REASON=$(echo $RESPONSE | jq -r '.tasks[0].stopReason')

  if [ "$STOP_CODE" == "EssentialContainerExited" ]; then
    CONTAINER_EXIT_CODE=$(echo $RESPONSE | jq -r '.tasks[0].containers[0].exitCode')
    if [ "$CONTAINER_EXIT_CODE" != "0" ]; then
      echo "DB マイグレーションコマンドでエラーが発生しました"
      echo "ARN: $TASK_ARN"
      echo "stopCode: $STOP_CODE"
      echo "stopReason: $STOP_REASON"
      echo "lastStatus: $TASK_STATUS"
      echo "exitCode: $CONTAINER_EXIT_CODE"
      exit 1
    fi

    echo "DB マイグレーションタスクが正常終了しました"
    echo "ARN: $TASK_ARN"
    echo "stopCode: $STOP_CODE"
    echo "stopReason: $STOP_REASON"
    echo "lastStatus: $TASK_STATUS"
    echo "exitCode: $CONTAINER_EXIT_CODE"
    
    break
  else
    echo "DB マイグレーションのコンテナ起動でエラーが発生しました"
    echo "ARN: $TASK_ARN"
    echo "stopCode: $STOP_CODE"
    echo "stopReason: $STOP_REASON"
    echo "lastStatus: $TASK_STATUS"
    echo "exitCode: $CONTAINER_EXIT_CODE"
    exit 1
  fi
done

前段階でマイグレーションが開始されているため、ここでは ecs describe-tasks コマンドでタスクのステータスを確認して、タスク完了までループで待機して、完了したら各パラメータを確認します。コンテナが正常に終了した場合は、基本的に stopCodeEssentialContainerExited コードが設定されるようです。stopCodeexitCode にエラーコードが設定されている場合は、exit コード 1 を返してビルドを失敗扱いにしています(echo 出力はデバッグ用です)。

脚注
  1. https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecs/describe-tasks.html#output ↩︎

  2. https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/stopped-task-errors.html ↩︎

  3. https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/stopped-task-error-codes.html ↩︎

  4. https://repost.aws/ja/knowledge-center/ecs-task-stopped ↩︎

Linc'well, inc.

Discussion