Amazon ECS 작업이 보류 중인 상태로 멈춘 이유는 무엇인가요?

5분 분량
0

Amazon Elastic Container Service(Amazon ECS) 작업이 보류 중인 상태에서 멈췄습니다.

간략한 설명

다음 시나리오에서는 일반적으로 Amazon ECS 작업이 보류 중인 상태로 중단됩니다.

  • Docker 대몬(daemon)이 응답하지 않습니다.
  • 도커 이미지가 큽니다.
  • Amazon ECS 컨테이너 에이전트가 작업 시작 도중에 Amazon ECS 서비스와의 연결이 끊겼습니다.
  • Amazon ECS 컨테이너 에이전트가 기존 작업을 중지하는 데 시간이 오래 걸립니다.
  • Amazon Virtual Private Cloud(Amazon VPC) 라우팅이 올바르게 구성되지 않았습니다.
  • 필수 컨테이너가 정상적인 상태가 아닌 비필수 컨테이너에 의존합니다.

해결 방법

작업이 보류 중 상태로 멈춘 이유를 확인하려면 다음 문제 해결 단계를 완료하세요.

참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하는 경우 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

Docker 대몬(daemon)이 응답하지 않음

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로 설정하세요. refer-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

참고: 출력에서 활성/실행 중임을 확인할 수 있습니다.

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.    에이전트 연결을 확인하려면, 해당 기간 동안 다음 로그에서 오류, 경고 또는 에이전트 전환 상태와 같은 키워드를 확인하세요.

/var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh에서 Amazon ECS 컨테이너 에이전트 로그를 확인하세요.
/var/log/ecs/ecs-init.log에서 Amazon ECS init 로그를 확인하세요.
/var/log/docker에서 Docker 로그를 확인하세요.

**참고:**또한 Amazon ECS 로그 수집기를 사용하여 Amazon ECS의 일반 운영 체제 로그, Docker 로그 및 컨테이너 에이전트 로그를 수집할 수 있습니다.

Amazon ECS 컨테이너 에이전트가 기존 작업을 중지하는 데 시간이 오래 걸림

컨테이너 에이전트가 Amazon ECS에서 새 작업을 시작할 때 (보류 상태에서 실행 중으로) 이전 작업을 중지해야 할 수 있습니다. 이러한 경우 에이전트가 이전 작업이 먼저 중지될 때까지 새 작업을 시작하지 않습니다.

컨테이너 인스턴스 수준에서 컨테이너 중지 및 시작 시간 제한을 제어하려면 다음 두 개의 파라미터를 설정합니다.

1.    /etc/ecs/ecs.config에서 ECS_CONTAINER_STOP_TIMEOUT 파라미터의 값을 조정합니다. 이 파라미터는 컨테이너가 정상적으로 종료되지 않을 경우 Amazon ECS가 컨테이너를 강제 종료하기까지 걸리는 시간을 설정합니다.

**참고:**Linux와 Windows의 기본값은 30s입니다.

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 라우팅이 올바르게 구성되지 않음

Amazon ECS 또는 Fargate 작업이 실행되는 VPC 서브넷의 구성을 확인하세요. 서브넷이 올바르게 구성되지 않은 경우 Amazon ECS 또는 Amazon ECR에 액세스할 수 없습니다. 이 문제를 해결하려면 서브넷의 라우팅 테이블에 인터넷 게이트웨이 또는 NAT 게이트웨이가 있어야 합니다. 인터넷으로 연결되는 송신 경로가 없는 서브넷에서 작업을 시작하는 경우 AWS PrivateLink를 사용하세요. 이렇게 하면 프라이빗 IP 주소를 통해 Amazon ECS API에 비공개로 액세스할 수 있습니다.

필수 컨테이너가 정상적인 상태가 아닌 비필수 컨테이너에 의존함

비필수 컨테이너가 정상적인 상태를 유지하지 못하고 필수 컨테이너가 이 컨테이너에 의존하는 경우 작업이 보류 중인 상태에서 멈춥니다. 이 경우 다음과 같은 메시지가 표시됩니다.

"stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long."

이 문제를 해결하려면 종속 (비필수) 컨테이너가 제대로 작동하는지 확인하세요. 근본적인 문제를 해결할 수 없다면, 이 컨테이너들을 필수로 만들어서 상당 기간 동안 보류 중인 상태가 되지 않도록 하세요.

관련 정보

컨테이너 종속성

Amazon ECS 컨테이너 에이전트(AWS GitHub)

AWS 공식
AWS 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠