ECSサービスはタスク定義を更新しません


8

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サービスに古いタスク定義の代わりに新しいタスク定義を実行させたい。

回答:


7

後で知ったように、タスクを更新しない理由は、目的のカウントが2に設定されており、使用できるEC2インスタンスが2つしかないためです。したがって、タスクが更新されていても、ECSエージェントは目的の数を保持しようとします。

解決策-EC2インスタンスを1つ追加します(この場合は3つのEC2インスタンス)。または、希望するタスク数よりも1つのインスタンスを追加します。

このようにして、新しいタスク定義を追加のインスタンスで実行できます。追加のEC2インスタンスで安定した後、ロードバランサーがトラフィックを更新されたインスタンスにリダイレクトする間、ECSエージェントは古いタスク定義の他の2つのインスタンスの接続をドレインします。ECSエージェントは、古いタスク定義を新しいものに置き換えます。そして、必要な数を2に維持します。


2

代替ソリューションはMinimum healthy percent、サービスの展開オプションをに設定することです0。これにより、新しいバージョンが展開される前に既存のタスクが停止します。

これにより、単一のec2インスタンスクラスターを使用できるようになり、関連するコスト削減などが可能になります。

デプロイメント間でダウンタイムが発生するため、本番環境には適していません


調査とサーバーの再起動の日々、この答えで解決しました!おかげで:)
ニア

2

サービスで実行中の「タスク」のタスク定義を更新するにはタスクを削除して、新しいタスクを開始する必要があります。

このようにして、タスクのタスク定義を更新する問題を解決します

私は次のコードを書きました:

    # 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

0

私はこれについて長い間頭を悩ませてきましたが、先週までどこにも実行可能な解決策はありませんでした。

AWSは、サービスを削除するための--forceオプションがある新しいAPIをリリースしました。現在直面しているターゲットグループの問題は、タスクに登録されているターゲットグループがすでに削除されており、新しいターゲットグループをそれにバインドできないためです。したがって、このタスクとサービスは現在破損しているため、対処する唯一の方法はそれを削除することであり、 それ以上更新することはできません。

このコマンドを使用して、サービスを今すぐ削除できます。先週は不可能でした!

aws ecs delete-service --service my-http-service --force true

お役に立てれば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.