외부 데이터 소스에서 일부 구성 파일을로드하는 작업이 있습니다. 설정이 업로드 된 후 설정이 모든 인스턴스로 전파되도록 서비스의 모든 작업을 다시 시작할 수 있기를 원합니다.
모든 서비스를 다시 시작하는 가장 좋은 방법은 무엇입니까?
‘작업 수’를 0으로 설정 한 다음 백업하는 ‘해결 방법’이 있습니다. 그러나 이것이 반드시 수행되어야하는 방식이 아니며 가동 중지 시간이 있습니다.
답변
AWS CLI 도구 사용 :
aws ecs update-service --force-new-deployment --service my-service
답변
당신이 원하는 것은 본질적으로 서비스를 재배치하는 것과 같습니다.
다운 타임없이 서비스를 재배치하려면 다음을 수행하십시오.
- 현재 작업 정의를 기반으로 새 작업 정의를 등록합니다 (동일한 세부 사항 포함).
- 기존 서비스를 새 작업 정의와 연결하여 UpdateService를 호출하십시오.
그러면 새 작업 정의에 대한 새 작업이 시작된 다음 이전 작업 정의에 대한 이전 작업이 종료되어 다운 타임없이 작업이 효과적으로 다시 시작됩니다.
참조 : UpdateService
답변
이것은 나를 위해 일했다 :
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
답변
ECS의 빌딩 블록으로서의 작업은 StopTask 호출에 의해 중지 될 수 있습니다 . 서비스는 동일한 API 호출로 중지 될 수있는 기본 작업으로 구성됩니다. 여기에 누락 된 부분 만 정의 된 패밀리 매개 변수를 사용 하여 ListTasks 호출의 결과를 둘러싼 것 입니다. 나는 이것을 도울 수있는 간단한 Lambda 함수 를 작성했다 .
답변
위의 @ 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
답변
Amazon 문서에 따르면 UpdateService API 호출을 사용하여 해당 작업을 스크립팅 할 수있는 것 같습니다 . 이전 링크에서 사용 가능한 일부 코드 샘플이 있으므로 적응할 수 있어야합니다. 작업 구성 업데이트가 문제의 가장 우아한 해결책이 된 후 적절한 작업 정의를 사용하여 서비스를 다시로드하는 스크립트를 작성하는 것처럼 보입니다.
ECS와 함께 AWS CLI를 사용하는 방법에 대한 추가 문서가 있는데, 이는 서비스 다시 시작을 일괄 스크립팅으로 처리하는 가장 쉬운 방법 인 것 같습니다.
답변
위대한 https://github.com/fdfk/ecsServiceRestart 작동
python ecsServiceRestart.py restart --services="app app2" --cluster=test