Amazon ECS 작업이 보류 중 상태에서 멈춘 이유는 무엇입니까?

최종 업데이트 날짜: 2019년 8월 20일

Amazon Elastic Container Service(Amazon ECS) 작업이 보류 중 상태에서 멈춘 이유는 무엇입니까?

간략한 설명

ECS 작업이 보류 중 상태에서 멈출 수 있는 몇 가지 일반적인 시나리오는 다음과 같습니다.

  • 도커 데몬이 응답하지 않는 경우
  • 도커 이미지가 큰 경우
  • 작업 시작 중에 ECS 컨테이너 에이전트에서 Amazon ECS 서비스와 연결이 끊어진 경우
  • ECS 컨테이너 에이전트에서 기존 작업을 중지하는 데 오래 걸리는 경우

작업이 보류 중 상태에서 멈춘 이유를 확인하려면 발생한 문제에 따라 다음 문제 해결 단계를 완료하십시오.

해결 방법

도커 데몬이 응답하지 않는 경우

CPU 문제의 경우 다음 단계를 완료하십시오.

1.    Amazon CloudWatch 지표를 사용하여 컨테이너 인스턴스가 최대 CPU를 초과했는지 확인합니다.

2.    필요에 따라 컨테이너 인스턴스의 크기를 늘립니다.

참고: 인스턴스 유형을 변경하려면 ECS 클러스터에 에이전트를 다시 등록할 수 있도록 에이전트 상태 파일(/var/lib/ecs/data/ecs_agent_data.json)을 제거해야 할 수도 있습니다.

메모리 문제의 경우 다음 단계를 완료하십시오.

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를 지정한 경우 캐시된 이미지가 없으면 이미지를 원격으로 가져옵니다. 그렇지 않으면, 인스턴스의 캐시된 이미지가 사용됩니다.

작업 시작 중에 ECS 컨테이너 에이전트에서 Amazon ECS 서비스와 연결이 끊어진 경우

1.    컨테이너 에이전트의 상태와 연결성을 확인하려면 컨테이너 인스턴스에서 다음 명령 중 하나를 실행합니다.

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에서 ECS 컨테이너 에이전트 로그를 확인합니다.
/var/log/ecs/ecs-init.log에서 ECS init 로그를 확인합니다.
/var/log/docker에서 도커 로그를 확인합니다.

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

ECS 컨테이너 에이전트에서 기존 작업을 중지하는 데 오래 걸리는 경우

ECS 컨테이너 에이전트가 ECS 백엔드에서 시작할 새 작업을 수신할 때 이전 작업을 중지하는 경우(보류 중에서 실행 중) 이전 작업이 중지될 때까지 이 새 작업은 시작되지 않습니다.

다음 두 파라미터를 설정하여 컨테이너 인스턴스 수준에서 컨테이너 중지 및 시작 제한 시간을 제어할 수 있습니다.

1.    /etc/ecs/ecs.config에서 ECS_CONTAINER_STOP_TIMEOUT 파라미터 값을 정상적으로 알아서 종료하지 않는 경우 강제로 컨테이너를 종료하기 전 경과 시간으로 설정합니다.

참고: Linux 및 Windows의 기본값은 30초입니다.

2.    /etc/ecs/ecs.config에서 ECS_CONTAINER_START_TIMEOUT 파라미터 값을 ECS 컨테이너 에이전트가 컨테이너를 시작하기 위해 중지되기 전 경과 시간으로 설정합니다.

참고: 기본값은 Linux의 경우 3m, Windows의 경우 8m입니다.

에이전트 버전이 1.26.0 이상인 경우 작업당 이전 중지 및 시작 제한 시간 파라미터를 정의할 수 있습니다. 이로 인해 작업이 중지됨 상태로 전환될 수 있습니다. 예를 들어, containerA는 완료, 성공 또는 정상 상태에 도달하는 containerB에 대한 종속성이 있습니다. containerB에 startTimeout 값이 지정되고 containerB가 해당 시간에 원하는 상태에 도달하지 못하면 containerA는 포기하고 시작되지 않습니다.

컨테이너 종속성에 대한 예제는 예제: 컨테이너 종속성을 참조하십시오.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?