O serviço Ecs não atualiza a definição de tarefa

8

No cluster ecs, tenho um serviço em execução com 2 instâncias ec2. E atualizo a definição da tarefa para obter a nova imagem do Docker. Mas a definição de tarefa antiga ainda está em execução, mesmo que exista uma nova definição de tarefa.

Eu usei os seguintes comandos para atualizar a definição e o serviço da tarefa.

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

Eu tentei várias vezes, mas não consigo descobrir onde errei. Desejo que o serviço ecs execute a nova definição de tarefa em vez da antiga.

Lahiru Liyanapathirana
fonte

Respostas:

7

Como descobri mais tarde, o motivo para não atualizar a tarefa é que a contagem desejada é definida como 2 e existem apenas 2 instâncias do EC2 disponíveis. Portanto, o agente do ECS tenta manter a contagem desejada, mesmo que a tarefa tenha sido atualizada.

Solução - Tenha uma instância EC2 extra (neste caso, 3 instâncias EC2). Ou tenha uma instância extra que o número preferido de tarefas.

Dessa maneira, a nova definição de tarefa pode ser executada na instância extra. Depois de estabilizado na instância extra do EC2, o agente do ECS drena a conexão nas outras duas instâncias para a definição de tarefa antiga, enquanto o balanceador de carga redireciona o tráfego para a instância atualizada. O agente do ECS substitui a definição de tarefa antiga pelas novas. E, em seguida, mantém a contagem desejada como 2.

Lahiru Liyanapathirana
fonte
2

Uma solução alternativa é definir a Minimum healthy percentopção de implantação do serviço 0, o que resulta na interrupção das tarefas existentes antes da implantação da nova versão.

Isso permite que clusters de instância ec2 únicos sejam usados, com a economia de custos associada, etc.

Não é adequado para produção, pois você terá tempo de inatividade entre implantações

Nick Hammond
fonte
Dias de investigação e reinicialização do servidor, resolvidos por esta resposta! Obrigado :)
Neara 11/07/19
2

Para atualizar uma definição de tarefa nas "tarefas" em execução no serviço Você precisa excluir as tarefas e Iniciar uma nova tarefa.

Dessa maneira, resolvo o problema de atualizar a definição de tarefa nas tarefas

Eu escrevi o seguinte código:

    # 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
Roopa
fonte
0

Venho estudando isso há muito tempo e nunca encontrei uma solução viável em nenhum lugar até a semana passada.

A AWS acaba de lançar sua nova API, na qual eles têm a opção --force para remoção de serviço. O problema do grupo-alvo que você está enfrentando é simplesmente porque o grupo-alvo registrado com sua tarefa já foi excluído e você não pode vincular um novo grupo-alvo a ele. Portanto, como essa tarefa e serviço estão corrompidos agora, a única maneira de lidar é excluí-lo, não é mais possível atualizá-lo.

Você pode usar este comando para excluir seu serviço agora; foi impossível na semana passada!

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

Espero que isto ajude

neocorp
fonte