AWS CLI で取得した ECS (on Fargate) タスクのレスポンスから実行結果を確認する
弊社ではバックエンド 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
)
コンテナが正常に起動したかは stopCode
と stopReason
を確認します。
-
stopCode
にはコンテナが停止した理由を示すコードが設定されますが、必ずしもエラーコードというわけではありません。[2] -
stopReason
には具体的な停止理由が設定される場合があります。特にstopCode
にエラーコードが設定されている場合は確認が必要です。[3]
コマンドが正常に実行されたかはexitCode
とreason
を確認します。 -
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
コマンドでタスクのステータスを確認して、タスク完了までループで待機して、完了したら各パラメータを確認します。コンテナが正常に終了した場合は、基本的に stopCode
に EssentialContainerExited
コードが設定されるようです。stopCode
や exitCode
にエラーコードが設定されている場合は、exit
コード 1 を返してビルドを失敗扱いにしています(echo
出力はデバッグ用です)。
Discussion