Ecs 서비스가 작업 정의를 업데이트하지 않습니다


8

ecs 클러스터에는 2 개의 ec2 인스턴스로 실행되는 서비스가 있습니다. 그리고 새로운 도커 이미지를 가져 오기 위해 작업 정의를 업데이트합니다. 그러나 새 작업 정의가 있어도 이전 작업 정의는 계속 실행됩니다.

다음 명령을 사용하여 작업 정의 및 서비스를 업데이트했습니다.

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 인스턴스 (이 경우 3 개의 EC2 인스턴스)가 있어야합니다. 또는 원하는 수의 작업보다 하나의 추가 인스턴스가 있어야합니다.

이런 식으로 새 작업 정의가 추가 인스턴스에서 실행될 수 있습니다. 추가 EC2 인스턴스에서 안정화 된 후 ECS 에이전트는 이전 작업 정의를 위해 다른 두 인스턴스에서 연결을 비우는 반면로드 밸런서는 트래픽을 업데이트 된 인스턴스로 리디렉션합니다. ECS 에이전트는 이전 작업 정의를 새 작업 정의로 바꿉니다. 그런 다음 원하는 카운트를 2로 유지합니다.


2

다른 해결책은 Minimum healthy percent서비스 의 배포 옵션을 로 설정 0하여 새 버전을 배포하기 전에 기존 작업을 중지하는 것입니다.

이를 통해 단일 ec2 인스턴스 클러스터를 사용하고 관련 비용을 절감 할 수 있습니다.

배포간에 다운 타임이 발생 하므로 프로덕션 에는 적합하지 않습니다.


이 답변으로 해결 된 서버 조사 및 재부팅 일! 감사합니다 :)
Neara

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.