Il servizio ecs non aggiorna la definizione dell'attività


8

Nel cluster ecs, ho un servizio in esecuzione con 2 istanze ec2. E aggiorno la definizione dell'attività per acquisire la nuova immagine finestra mobile. Ma la vecchia definizione di attività è ancora in esecuzione anche se esiste una nuova definizione di attività.

Ho usato i seguenti comandi per aggiornare la definizione e il servizio dell'attività.

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

Ho provato diverse volte ma non riesco a capire dove ho sbagliato. Voglio ottenere il servizio ecs per eseguire la nuova definizione di attività anziché quella precedente.

Risposte:


7

Come ho scoperto in seguito, il motivo del mancato aggiornamento dell'attività è che il conteggio desiderato è impostato su 2 e sono disponibili solo 2 istanze EC2. Quindi l'agente ECS tenta di conservare il conteggio desiderato anche se l'attività è stata aggiornata.

Soluzione: disporre di un'istanza EC2 aggiuntiva (in questo caso 3 istanze EC2). O hai un'istanza in più rispetto al numero preferito di attività.

In questo modo la nuova definizione dell'attività può essere eseguita sull'istanza aggiuntiva. Dopo che si è stabilizzato sull'istanza EC2 aggiuntiva, l'agente ECS scaricherà la connessione sulle altre due istanze per la vecchia definizione dell'attività, mentre il bilanciamento del carico reindirizzerà il traffico all'istanza aggiornata. L'agente ECS sostituisce la definizione di attività precedente con quelle nuove. E quindi mantiene il conteggio desiderato come 2.


2

Una soluzione alternativa consiste nell'impostare l' Minimum healthy percentopzione di distribuzione del servizio 0, che comporta l'arresto delle attività esistenti prima della distribuzione della nuova versione.

Ciò consente l'utilizzo di singoli cluster di istanza ec2, con i relativi risparmi sui costi, ecc

Non adatto alla produzione in quanto si avranno tempi di inattività tra le distribuzioni


Giorni di indagine e riavvio del server, risolti da questa risposta! Grazie :)
Neara,

2

Per aggiornare una definizione di attività nelle "attività" in esecuzione nel servizio È necessario eliminare le attività e avviare una nuova attività.

In questo modo, risolvo il problema dell'aggiornamento della definizione delle attività nelle attività

Ho scritto il seguente codice:

    # 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

Mi sto grattando la testa da molto tempo e non ho mai trovato una soluzione praticabile da nessuna parte fino alla settimana scorsa.

AWS ha appena rilasciato la sua nuova API in cui ha l' opzione --force per la rimozione del servizio. Il problema del gruppo target che stai affrontando è semplicemente perché il gruppo target registrato con la tua attività è già stato eliminato e non puoi associare un nuovo gruppo target a esso. Quindi, poiché questa attività e questo servizio sono ora corrotti, l'unico modo per gestirlo è eliminarlo, non è più possibile aggiornarlo.

È possibile utilizzare questo comando per eliminare il servizio ora; è stato impossibile la scorsa settimana!

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

Spero che sia di aiuto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.