Amazon ECS-서비스의 모든 작업을 어떻게 다시 시작합니까?


18

외부 데이터 소스에서 일부 구성 파일을로드하는 작업이 있습니다. 설정이 업로드 된 후 설정이 모든 인스턴스로 전파되도록 서비스의 모든 작업을 다시 시작할 수 있기를 원합니다.

모든 서비스를 다시 시작하는 가장 좋은 방법은 무엇입니까?

'작업 수'를 0으로 설정 한 다음 백업하는 '해결 방법'이 있습니다. 그러나 이것이 반드시 수행되어야하는 방식이 아니며 가동 중지 시간이 있습니다.


추신 : 누군가가 훌륭한 아마존 태그를 만들 수 있다면 :)
Dennkster

태그를 잘 부르면 나중에 추가했습니다.
ceejayoz

Amazon 의이 문서 는 현재 사용중인 해결 방법을 설명합니까?
Matt

답변:


16

AWS CLI 도구 사용 :

aws ecs update-service --force-new-deployment --service my-service

9

당신이 원하는 것은 본질적으로 서비스를 재배치하는 것과 같습니다.

다운 타임없이 서비스를 재배치하려면 다음을 수행하십시오.

  1. 현재 작업 정의를 기반으로 새 작업 정의를 등록합니다 (동일한 세부 사항 포함).
  2. 기존 서비스를 새 작업 정의와 연결하여 UpdateService를 호출하십시오.

그러면 새 작업 정의에 대한 새 작업이 시작된 다음 이전 작업 정의에 대한 이전 작업이 종료되어 다운 타임없이 작업이 효과적으로 다시 시작됩니다.

참조 : UpdateService


1
AWS 콘솔을 통해이 작업을 수행해야했으며 이것이 가장 쉬운 방법입니다. 필요한 경우 전체 프로세스를 수동으로 관리 할 수 ​​있습니다. UI에서 작업 정의로 이동하여 새 개정을 작성하고 서비스를 업데이트 한 다음 약간의 시간이 지나면 모든 작업을 신속하게 다시 시작하고 프로세스에보다 강력한 설정이 필요하지 않은 경우 유용합니다. 작업이 다시 시작됩니다!
geerlingguy

2
서비스 업데이트 "Force new deployment"에 체크 박스를 추가하여 프로세스의 1 단계를 건너 뛸 수 있습니다.
Josh Vickery

"새 배포 강제 적용"옵션에 대한 의견은 본인이 수락 한 답변입니다.
ecbrodie 2016 년

3

이것은 나를 위해 일했다 :

aws ecs list-tasks --cluster <cluster_name> | jq -r ".taskArns[]" | awk '{print "aws ecs stop-task --cluster <cluster_name> --task \""$0"\""}' | sh

그런 다음 동일한 인스턴스에서 작업을 다시 만듭니다.

새 인스턴스가 필요한 경우 다음을 사용하십시오.

aws ecs list-services --cluster <cluster_name> | jq -r ".serviceArns[]" | awk '{print "aws ecs update-service --cluster <cluster_name> --force-new-deployment  --service \""$0"\""}' | sh

두 번째 것은 새로운 인스턴스를 시작하는 것 이외의 일을하는 것 같습니다.
user130681

2

ECS의 빌딩 블록으로서의 작업은 StopTask 호출에 의해 중지 될 수 있습니다 . 서비스는 동일한 API 호출로 중지 될 수있는 기본 작업으로 구성됩니다. 여기에 누락 된 부분 만 정의 된 패밀리 매개 변수를 사용 하여 ListTasks 호출의 결과를 둘러싼 것 입니다. 나는 이것을 도울 수있는 간단한 Lambda 함수 를 작성했다 .


1

위의 @ user326608의 답변을 확장하고 있습니다 (통찰력에 감사드립니다!).

모든 작업을 중지하여 클러스터대한 모든 서비스에 대한 모든 작업을 다시 시작 합니다. 각 서비스는 자동으로 시작됩니다 X새 작업의 수, X서비스의입니다 desired task count.

#!/bin/bash

index=0
taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)

until [ "$taskArn" = "None" ]
do 
  aws ecs stop-task --cluster ${CLUSTER_NAME} --task $taskArn
  ((index++))
  taskArn=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns[${index}]" --output text)
done

참고 : 단일 서비스에 대한 작업을 다시 시작하려면 @Ben Whaley가 설명한대로 새 배포를 강제 실행하십시오.
sudo 영혼

0

Amazon 문서에 따르면 UpdateService API 호출을 사용하여 해당 작업을 스크립팅 할 수있는 것 같습니다 . 이전 링크에서 사용 가능한 일부 코드 샘플이 있으므로 적응할 수 있어야합니다. 작업 구성 업데이트가 문제의 가장 우아한 해결책이 된 후 적절한 작업 정의를 사용하여 서비스를 다시로드하는 스크립트를 작성하는 것처럼 보입니다.

ECS와 함께 AWS CLI를 사용하는 방법에 대한 추가 문서가 있는데, 이는 서비스 다시 시작을 일괄 스크립팅으로 처리하는 가장 쉬운 방법 인 것 같습니다.


스크립트 / 명령 시퀀스 작성 및 게시 작업을 수행 할 수는 있지만 현재 이러한 종류의 테스트에 사용할 수있는 AWS 계정에 액세스 할 수 없으므로 그렇게하지 않기 때문에 초안 / 시작점이 될 것입니다. 그것을 효과적으로 테스트 할 수 있습니다 ...
Matt


0

나는이 일을하고있다. 한 번에 하나의 작업을 안정적으로 다시 시작할 수 있으면 매우 유용합니다. 아래 스크립트는 현재 사용중인 것입니다. 꽤 신중합니다. 각 작업에 대해 리턴을 누르십시오. 서비스가 안정 될 때까지 기다리라는 명령이 있지만 이것이 작업이 건강하다는 것을 의미하지는 않습니다. 그리고 시간이 지연 될 수있었습니다. 그러나 결국 상황이 나빠지면 스크립트가 천천히 앱을 종료시킵니다. 그래서...

#!/bin/bash

if [ $# -eq 2 ]
then
    cluster=$1
    service=$2
else
    echo "Usage: $0 <cluster> <service>"
    exit 1
fi

echo
echo "Restarting $cluster $service tasks:"
echo

for task in $(aws ecs list-tasks --cluster $cluster --service-name $service | awk '{print $2}')
do
    echo
    echo -n "Press enter to stop $task"
    read -r
    echo
    echo "stopping $task..."
    aws ecs stop-task --cluster "$cluster" --task "$task"
    echo
    # aws ecs wait services-stable --cluster "$cluster" --services "$service"    done

0

ff를 수행하는 python boto3 스크립트가 있습니다.

  1. 다음을 통해 서비스에 대해 'RUNNING'상태의 작업 목록을 만듭니다.

ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')

  1. 위의 작업 목록에 대해 for 루프를 수행하고 각 via를 중지하십시오.

ecs_client.stop_task(cluster=mycluster,task=mytask)

  1. runningCount 및 desiredCount를 가져 오는 서비스를 설명합니다.

ecs_client.describe_services(cluster=mycluster,services=[myservice])

  1. while 루프 if runningCount <desiredCount-작업이 현재 중지 중이고 아직 교체되지 않았으므로 다음 작업을 아직 중단하지 마십시오!

while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:

while 루프가 더 이상 참이 아닌 경우 (실행 및 카운트가 모두 동일 함) 목록에서 다음 작업을 중지합니다.

이것은 실제 흐름이며 현재 작업에 여전히 고용되어 있고 내 코드가 모두 속해 있으므로 실제 코드를 표시 할 수 없습니다. :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.