외부 데이터 소스에서 일부 구성 파일을로드하는 작업이 있습니다. 설정이 업로드 된 후 설정이 모든 인스턴스로 전파되도록 서비스의 모든 작업을 다시 시작할 수 있기를 원합니다.
모든 서비스를 다시 시작하는 가장 좋은 방법은 무엇입니까?
'작업 수'를 0으로 설정 한 다음 백업하는 '해결 방법'이 있습니다. 그러나 이것이 반드시 수행되어야하는 방식이 아니며 가동 중지 시간이 있습니다.
외부 데이터 소스에서 일부 구성 파일을로드하는 작업이 있습니다. 설정이 업로드 된 후 설정이 모든 인스턴스로 전파되도록 서비스의 모든 작업을 다시 시작할 수 있기를 원합니다.
모든 서비스를 다시 시작하는 가장 좋은 방법은 무엇입니까?
'작업 수'를 0으로 설정 한 다음 백업하는 '해결 방법'이 있습니다. 그러나 이것이 반드시 수행되어야하는 방식이 아니며 가동 중지 시간이 있습니다.
답변:
당신이 원하는 것은 본질적으로 서비스를 재배치하는 것과 같습니다.
다운 타임없이 서비스를 재배치하려면 다음을 수행하십시오.
그러면 새 작업 정의에 대한 새 작업이 시작된 다음 이전 작업 정의에 대한 이전 작업이 종료되어 다운 타임없이 작업이 효과적으로 다시 시작됩니다.
참조 : 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
위의 @ 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
나는이 일을하고있다. 한 번에 하나의 작업을 안정적으로 다시 시작할 수 있으면 매우 유용합니다. 아래 스크립트는 현재 사용중인 것입니다. 꽤 신중합니다. 각 작업에 대해 리턴을 누르십시오. 서비스가 안정 될 때까지 기다리라는 명령이 있지만 이것이 작업이 건강하다는 것을 의미하지는 않습니다. 그리고 시간이 지연 될 수있었습니다. 그러나 결국 상황이 나빠지면 스크립트가 천천히 앱을 종료시킵니다. 그래서...
#!/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
ff를 수행하는 python boto3 스크립트가 있습니다.
ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')
ecs_client.stop_task(cluster=mycluster,task=mytask)
ecs_client.describe_services(cluster=mycluster,services=[myservice])
while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:
while 루프가 더 이상 참이 아닌 경우 (실행 및 카운트가 모두 동일 함) 목록에서 다음 작업을 중지합니다.
이것은 실제 흐름이며 현재 작업에 여전히 고용되어 있고 내 코드가 모두 속해 있으므로 실제 코드를 표시 할 수 없습니다. :)