Ecsクラスターでは、2つのec2インスタンスでサービスを実行しています。そして、新しいdockerイメージを取得するようにタスク定義を更新します。ただし、新しいタスク定義があっても、古いタスク定義はまだ実行されています。
次のコマンドを使用して、タスクの定義とサービスを更新しました。
aws ecs register-task-definition --family service90-task --cli-input-json file://service90-task.json
aws ecs update-service --cluster service90-cluster --service service90-service --desired-count 0
TASK_REVISION=`aws ecs describe-task-definition --task-definition service90-task | egrep "revision" | tr "/" " " | awk '{print $2}' | sed 's/"$//'`
aws ecs update-service --cluster service90-cluster --service service90-service --task-definition service90-task:${TASK_REVISION} --desired-count 2
何度か試しましたが、どこが間違っているのかわかりません。 ecsサービスに古いタスク定義の代わりに新しいタスク定義を実行させたい。
後で知ったように、タスクを更新しない理由は、必要なカウントが2に設定されており、使用できるEC2インスタンスが2つしかないためです。そのため、タスクが更新されていても、ECSエージェントは必要な数を保持しようとします。
解決策-EC2インスタンスを1つ追加します(この場合は3つのEC2インスタンス)。または、希望するタスク数よりも1つのインスタンスを追加します。
このようにして、新しいタスク定義を追加のインスタンスで実行できます。追加のEC2インスタンスで安定した後、ECSエージェントは古いタスク定義の他の2つのインスタンスの接続をドレインし、ロードバランサーは更新されたインスタンスにトラフィックをリダイレクトします。 ECSエージェントは、古いタスク定義を新しいものに置き換えます。そして、必要な数を2に維持します。
別の解決策は、Minimum healthy percent
へのサービスの展開オプション0
。これにより、新しいバージョンがデプロイされる前に既存のタスクが停止します。
これにより、単一のec2インスタンスクラスターを使用できるようになり、関連するコスト削減などが可能になります。
本番環境には適していませんデプロイメント間でダウンタイムが発生するため
サービスで実行中の「タスク」のタスク定義を更新するにはタスクを削除して、新しいタスクを開始する必要があります。
このようにして、タスクのタスク定義を更新する問題を解決します
私は次のコードを書きました:
# Register a new Task definition
aws ecs register-task-definition --family testing-cluster --cli-input-json file://scripts/taskdefinition/testingtaskdef.json --region $AWS_REGION
# Update Service in the Cluster
aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE --task-definition testing-cluster --desired-count 1 --region $AWS_REGION
DECRIBED_SERVICE=$(aws ecs describe-services --region $AWS_REGION --cluster $CLUSTER_NAME --services $SERVICE);
CURRENT_DESIRED_COUNT=$(echo $DECRIBED_SERVICE | jq --raw-output ".services[0].desiredCount")
# - echo $CURRENT_DESIRED_COUNT
CURRENT_TASK_REVISION=$(echo $DECRIBED_SERVICE | jq -r ".services[0].taskDefinition")
echo "Current Task definition in Service" + $CURRENT_TASK_REVISION
CURRENT_RUNNING_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].runningCount")
echo $CURRENT_RUNNING_TASK
CURRENT_STALE_TASK=$(echo $DECRIBED_SERVICE | jq -r ".services[0].deployments | .[] | select(.taskDefinition != \"$CURRENT_TASK_REVISION\") | .taskDefinition")
echo "Task defn apart from current service Taskdefn" + $CURRENT_STALE_TASK
# - echo $CURRENT_STALE_TASK
tasks=$(aws ecs --region $AWS_REGION list-tasks --cluster $CLUSTER_NAME | jq -r '.taskArns | map(.[40:]) | reduce .[] as $item (""; . + $item + " ")')
echo "Tasks are as follows"
echo $tasks
TASKS=$(aws ecs --region $AWS_REGION describe-tasks --cluster $CLUSTER_NAME --task $tasks);
# - echo $TASKS
OLDER_TASK=$(echo $TASKS | jq -r ".tasks[] | select(.taskDefinitionArn!= \"$CURRENT_TASK_REVISION\") | .taskArn | split(\"/\") | .[1] ")
echo "Older Task running " + $OLDER_TASK
for old_task in $OLDER_TASK; do
aws ecs --region us-east-1 stop-task --cluster $CLUSTER_NAME --task $old_task
done
# Run new tasks with the updated new Task-definition
aws ecs --region $AWS_REGION run-task --cluster $CLUSTER_NAME --task-definition $CURRENT_TASK_REVISION
私はこれについて長い間頭を悩ませてきましたが、先週までどこにも実行可能な解決策はありませんでした。
AWSは新しいAPIをリリースしました。サービスを削除するための-forceオプションがあります。現在直面しているターゲットグループの問題は、タスクに登録されているターゲットグループがすでに削除されており、新しいターゲットグループをそれにバインドできないためです。したがって、このタスクとサービスは現在破損しているため、対処する唯一の方法はそれを削除することですこれ以上更新することはできません
このコマンドを使用して、今すぐサービスを削除できます。先週は不可能でした!
aws ecs delete-service --service my-http-service --force true
お役に立てれば