Amazon Elastic Container Service(Amazon ECS) 작업이 보류 중 상태에서 멈췄습니다.
간략한 설명
ECS 작업이 보류 중 상태에서 멈출 수 있는 몇 가지 일반적인 시나리오는 다음과 같습니다.
- Docker 데몬이 응답하지 않습니다.
- Docker 이미지가 큽니다.
- 작업 시작 중에 Amazon ECS 컨테이너 에이전트에서 Amazon ECS 서비스와 연결이 끊어졌습니다.
- Amazon ECS 컨테이너 에이전트에서 기존 작업을 중지하는 데 오래 걸립니다.
- Amazon Virtual Private Cloud(Amazon VPC) 라우팅이 잘못 구성되었습니다.
해결 방법
작업이 보류 중 상태에서 멈춘 이유를 확인하려면 다음 문제 해결 단계를 완료하십시오.
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.
Docker 데몬이 응답하지 않는 경우
CPU 문제의 경우 다음 단계를 완료하세요.
1. Amazon CloudWatch 지표를 사용하여 컨테이너 인스턴스가 최대 CPU를 초과했는지 확인합니다.
2. 필요에 따라 컨테이너 인스턴스의 크기를 늘립니다.
메모리 문제의 경우 다음 단계를 완료하세요.
1. free 명령을 실행하여 시스템에서 사용 가능한 메모리 크기를 확인합니다.
2. 필요에 따라 컨테이너 인스턴스의 크기를 늘립니다.
I/O 문제의 경우 다음 단계를 완료하십시오.
1. iotop 명령을 실행합니다.
2. 가장 많은 IOPS를 사용하고 있는 서비스 내 작업을 알아봅니다. 그런 다음, 작업 배치 제약 구속 조건과 전략을 사용하여 이러한 작업을 개별 컨테이너 인스턴스에 배포합니다.
-또는-
CloudWatch를 사용하여 Amazon Elastic Block Store(Amazon EBS) BurstBalance 지표에 대한 경보를 생성합니다. 그런 다음, AWS Lambda 함수 또는 고유한 사용자 지정 로직을 사용하여 작업을 밸런싱합니다.
도커 이미지가 큰 경우
이미지가 클수록 다운로드하는 데 오래 걸리고 작업이 보류 중 상태인 시간이 늘어납니다.
전환 시간을 단축하려면 이미지 캐싱을 활용하도록 ECS_IMAGE_PULL_BEHAVIOR 파라미터를 조정합니다.
참고: 예를 들어 /etc/ecs/ecs.config에서 ECS_IMAGE_PULL_BEHAVIOR 파라미터를 prefer-cached로 설정합니다. prefer-cached를 지정한 경우 캐시된 이미지가 없으면 이미지를 원격으로 가져옵니다. 그렇지 않으면, 인스턴스의 캐시된 이미지가 사용됩니다.
작업 시작 중에 Amazon ECS 컨테이너 에이전트에서 Amazon ECS 서비스와 연결이 끊어진 경우
1. Amazon ECS 컨테이너 에이전트의 상태와 연결성을 확인하려면 컨테이너 인스턴스에서 다음 명령 중 하나를 실행합니다.
Amazon Linux 1의 경우:
$ sudo status ecs
$ sudo docker ps -f name=ecs-agent
Amazon Linux 2의 경우:
$ sudo systemctl status ecs
$ sudo docker ps -f name=ecs-agent
참고: 출력에 active/running이 표시되어야 합니다.
2. ECS 컨테이너 인스턴스에서 실행 중인 작업의 메타데이터를 보려면 컨테이너 인스턴스에서 다음 명령을 실행합니다.
$ curl http://localhost:51678/v1/metadata
다음과 같은 출력이 표시됩니다.
{
"Cluster": "CLUSTER_ID",
"ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
"Version": "Amazon ECS Agent - AGENT "
}
3. 실행 중인 작업에 대한 정보를 보려면 컨테이너 인스턴스에서 다음 명령을 실행합니다.
$ curl http://localhost:51678/v1/tasks
다음과 같은 출력이 표시됩니다.
{
"Tasks": [
{
"Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
"DesiredStatus": "RUNNING",
"KnownStatus": "RUNNING",
... ...
}
]
}
4. 연결 해제된 에이전트와 관련된 문제인 경우 다음 명령 중 하나를 사용하여 컨테이너 에이전트를 다시 시작합니다.
Amazon Linux 1의 경우:
$ sudo stop ecs
$ sudo start ecs
Amazon Linux 2의 경우:
$ sudo systemctl stop ecs
$ sudo systemctl start ecs
다음과 유사한 출력이 나타납니다.
ecs start/running, process xxxx
5. 에이전트 연결성을 확인하려면 관련 기간에 다음 로그에서 "error", "warn" 또는 "agent transition state"와 같은 키워드가 있는지 확인합니다.
/var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh에서 Amazon ECS 컨테이너 에이전트 로그를 확인합니다.
/var/log/ecs/ecs-init.log에서 Amazon ECS init 로그를 확인합니다.
/var/log/docker에서 도커 로그를 확인합니다.
참고: 또한 Amazon ECS 로그 수집기를 사용하여 일반 운영 체제 로그, 도커 로그 및 Amazon ECS용 컨테이너 에이전트 로그를 수집할 수 있습니다.
Amazon ECS 컨테이너 에이전트에서 기존 작업을 중지하는 데 오래 걸리는 경우
Amazon ECS 컨테이너 에이전트가 Amazon ECS에서 시작할 새 작업을 수신할 때 이전 작업을 중지하는 경우(보류 중에서 실행 중) 이전 작업이 중지될 때까지 이 새 작업은 시작되지 않습니다.
다음 두 파라미터를 설정하여 컨테이너 인스턴스 수준에서 컨테이너 중지 및 시작 제한 시간을 제어할 수 있습니다.
1. /etc/ecs/ecs.config에서 ECS_CONTAINER_STOP_TIMEOUT 파라미터 값을 정상적으로 알아서 종료하지 않는 경우 강제로 컨테이너를 종료하기 전 경과 시간으로 설정합니다.
참고: Linux 및 Windows의 기본값은 30초입니다.
2. /etc/ecs/ecs.config에서 ECS_CONTAINER_START_TIMEOUT 파라미터 값을 Amazon ECS 컨테이너 에이전트가 컨테이너를 시작하기 위해 중지되기 전 경과 시간으로 설정합니다.
참고: 기본값은 Linux의 경우 3m, Windows의 경우 8m입니다.
에이전트 버전이 1.26.0 이상인 경우 작업당 이전 중지 및 시작 제한 시간 파라미터를 정의할 수 있습니다. 이로 인해 작업이 중지됨 상태로 전환될 수 있습니다. 예를 들어, containerA는 완료, 성공 또는 정상 상태에 도달하는 containerB에 대한 종속성이 있다고 가정해보겠습니다. containerB에 startTimeout 값을 지정하지 않고 containerB가 해당 시간에 원하는 상태에 도달하지 못하면 containerA는 시작되지 않습니다.
컨테이너 종속성에 대한 예제는 AWS GitHub의 예제: 컨테이너 종속성을 참조하세요.
Amazon VPC 라우팅이 잘못 구성되었습니다.
잘못 구성된 VPC 또는 서브넷으로 인해 Amazon ECS 또는 Amazon ECR에 액세스 권한이 없는 VPC 서브넷에서 실행되도록 Amazon ECS 또는 Fargate 작업을 구성했을 수 있습니다. 이 문제를 해결하려면 서브넷의 라우팅 테이블에 인터넷 게이트웨이 또는 NAT 게이트웨이가 있는지 확인하십시오. 인터넷으로의 송신 라우팅이 없는 서브넷에서 작업을 시작하는 경우 AWS PrivateLink를 사용하여 프라이빗 IP 주소를 통해 Amazon ECS API에 비공개로 액세스합니다.
관련 정보
컨테이너 종속성
Amazon ECS Container Agent(AWS GitHub)