Amazon Elastic Container Service(Amazon ECS) 클러스터에 새 서비스를 배포하면 작업이 잘못 배포되거나 종료됩니다.
해결 방법
리소스 용량이 충분한 컨테이너를 사용하고 있는지 확인
새로운 배포에서 로드 밸런서 상태 확인에 지속적으로 실패하는 경우, CpuUtilized, CpuReserved 및 MemoryUtilized Amazon ECS Container Insights 지표를 확인하십시오. Application Load Balancer를 사용하는 경우 TargetResponseTime도 확인하십시오.
또한 애플리케이션 스타트업 시간보다 긴 값으로 HealthCheckGracePeriodSeconds 속성을 구성하십시오. 상태 확인 응답이 지연되면 장애가 발생하고 Amazon ECS가 작업을 다시 반복하도록 할지 확인하는 프롬프트가 표시됩니다.
컨테이너 상태 및 종료 코드 확인
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
예기치 않게 종료되는 작업의 경우 다음 describe-tasks 명령을 실행하여 컨테이너 종료 코드를 확인하십시오.
aws ecs describe-tasks --cluster ECS_CLUSTER --tasks TASK_ARN -- region REGION
참고: ECS_CLUSTER를 클러스터 이름으로 바꾸고, TASK_ARN을 작업 ARN으로 바꾸고, REGION을 AWS 리전으로 바꾸십시오.
위 명령의 출력이 0이면 작업이 성공적으로 시작된 것입니다. 출력이 1이면 애플리케이션 오류가 발생한 것이므로 애플리케이션 로그를 확인해야 합니다. 출력이 137이면 컨테이너가 일반적으로 메모리 부족 문제로 인해 발생하는 SIGKILL 신호를 수신한 것입니다. 이 문제를 해결하려면 Amazon ECS에서 OutOfMemory 오류를 해결하려면 어떻게 해야 합니까? 및 Amazon ECS 작업이 중지되는 이유는 무엇입니까?를 참조하십시오.
작업 정의 구성 검토
모든 작업 정의 구성이 유효한지 확인하십시오. 특히 작업 정의를 수정하거나 새 작업 정의를 만든 후에는 반드시 확인해야 합니다. 작업 정의 구성을 확인하려면 독립형 작업을 실행하십시오.
로드 밸런서 설정 구성
로드 밸런서에서 deregistration_delay.timeout_seconds를 요구 사항에 맞게 구성하십시오. 오래 수행해야 하는 요청의 경우 더 높은 값을 사용하십시오. Amazon Elastic Compute Cloud(Amazon EC2) 스팟 인스턴스의 경우 이 값은 120초 미만이어야 합니다.
deregistration_delay.timeout_seconds를 수정하려면 다음 modify-target-group-attributes 명령을 실행하십시오.
aws elbv2 modify-target-group-attributes --target-group-arn
EXAMPLE_ARN --attributes Key=deregistration_delay.timeout_seconds,Value=120
참고: EXAMPLE_ARN을 로드 밸런서 ARN으로 바꾸고 120을 등록 취소 지연 제한 시간(초)으로 바꾸십시오.
또한 로드 밸런서의 상태 확인 설정을 최적화하십시오. 설정이 애플리케이션에 대해 너무 엄격하면 로드 밸런서가 대상을 비정상으로 빈번하게 표시할 수 있습니다.
애플리케이션의 정상 종료 시간 구성
기본적으로 ECS_CONTAINER_STOP_TIMEOUT은 30초로 설정됩니다. 새로운 Amazon ECS 배포에서 이전 작업의 드레이닝 단계 중에 애플리케이션에 액세스하면 5xx 오류가 발생할 수 있습니다. 애플리케이션에 액세스할 때 문제가 발생하면 애플리케이션의 정상 종료 요구 사항에 따라 ECS_CONTAINER_STOP_TIMEOUT의 값을 증가하십시오. 업데이트된 값은 테스트 환경에서 테스트한 후 배포하는 것이 좋습니다.
값을 업데이트하려면 다음 예제와 비슷한 코드를 작업 정의에 추가하십시오.
{
"containerDefinitions": [
{
"name": "your-container",
"image": "your-image",
"stopTimeout": 120
}
]
}
참고: 120을 ECS_CONTAINER_STOP_TIMEOUT 값으로 바꾸십시오.
정상 종료를 구성하려면 애플리케이션에 SIGTERM 핸들러를 추가하십시오. AWS Fargate 스팟의 경우 SIGTERM 핸들러 중에 DeregisterTargets를 호출하도록 구성을 설정합니다. 이렇게 하면 Amazon ECS가 로드 밸런서의 대상 그룹에서 FARGATE_SPOT 작업의 등록을 취소할 수 있습니다.
관련 정보
Amazon ECS의 로드 밸런서 연결 드레이닝 파라미터 최적화