내용으로 건너뛰기

연결이 끊긴 Amazon ECS 에이전트의 문제를 해결하려면 어떻게 해야 합니까?

6분 분량
0

Amazon Elastic Container Service(Amazon ECS)용 컨테이너 인스턴스의 연결이 끊겼습니다.

간략한 설명

Amazon ECS 컨테이너 에이전트 연결이 한 시간 동안 여러 번 끊겼다가 다시 연결되는 것은 정상입니다. 이러한 변경 이벤트는 걱정할 필요가 없습니다. 연결 이벤트가 단 몇 분 동안만 지속된다면 컨테이너 에이전트 또는 컨테이너 인스턴스의 문제 때문이 아닐 수 있습니다.

하지만 컨테이너 에이전트의 연결 끊김 상태가 더 오래 유지된다면 컨테이너 인스턴스는 Amazon ECS 클러스터의 일부로 작동할 수 없습니다. 이 문제는 다음 이유 중 하나로 인해 발생할 수 있습니다.

  • 네트워킹 문제로 인해 인스턴스와 Amazon ECS 간의 통신이 차단됩니다.
  • 컨테이너 에이전트에 Amazon ECS 엔드포인트와 통신하는 데 필요한 AWS Identity and Access Management(AWS IAM) 권한이 없습니다.
  • 컨테이너 인스턴스 내부의 호스트 또는 Docker 대몬에 문제가 있습니다.
  • 기본 호스트에 리소스 경합이 있습니다.

참고: Amazon ECS 컨테이너 에이전트의 최신 버전을 사용하는 것이 좋습니다.

해결 방법

참고: 다음 해결 방법은 Amazon ECS 최적화 Amazon Linux 2 AMI에 적용됩니다.

SSH 키를 사용하여 Amazon EC2 인스턴스에 연결할 수 있습니다. SSH 키가 생성되지 않은 경우 AWS Systems Manager의 기능인 세션 관리자를 사용하여 인스턴스에 연결할 수 있습니다. 기본적으로 Systems Manager 에이전트는 Amazon Linux 2 AMI와 Amazon Linux 2 ECS 최적화 기본 AMI에 설치됩니다.

컨테이너 인스턴스에서 컨테이너 에이전트가 실행되고 있는지 확인

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

$ sudo systemctl status ecs            
$ sudo docker ps -f name=ecs-agent

출력은 **active (running)**를 나타내며 다음과 비슷합니다.

ecs.service - Amazon Elastic Container Service - container agent   Loaded: loaded (/usr/lib/systemd/system/ecs.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-02-15 15:51:09 UTC; 37min ago
     Docs: https://aws.amazon.com/documentation/ecs/
  Process: 30039 ExecStopPost=/usr/libexec/amazon-ecs-init post-stop (code=exited, status=0/SUCCESS)
  Process: 29987 ExecStop=/usr/libexec/amazon-ecs-init stop (code=exited, status=0/SUCCESS)
  Process: 30077 ExecStartPre=/usr/libexec/amazon-ecs-init pre-start (code=exited, status=0/SUCCESS)
 Main PID: 30123 (amazon-ecs-init)
    Tasks: 5
   Memory: 3.7M
   CGroup: /system.slice/ecs.service
           └─30123 /usr/libexec/amazon-ecs-init start

CONTAINER ID   IMAGE                                            COMMAND    CREATED      STATUS                PORTS     NAMES
eb1dc8d4ab3b   amazon/amazon-ecs-agent:latest   "/agent"        3 days ago   Up 3 days (healthy)                        ecs-agent

에이전트의 연결이 끊어져 문제가 발생한 경우 다음 명령을 실행하여 ECS 에이전트를 다시 시작합니다.

$ sudo systemctl restart ecs

참고: 위 명령을 실행하면 출력이 반환되지 않습니다.

에이전트가 실행되고 있는지 확인하려면 다음 명령을 실행합니다.

sudo systemctl status ecs

Docker 서비스가 컨테이너 인스턴스에서 실행 중인지 확인

영향을 받는 컨테이너 인스턴스에서 Docker 서비스가 실행되고 있는지 확인하려면 다음 명령을 실행합니다.

sudo systemctl status docker

출력은 **active (running)**를 나타내며 다음과 비슷합니다.

docker.service - Docker Application Container Engine   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-02-11 17:42:32 UTC; 3 days ago
     Docs: https://docs.docker.com
  Process: 4307 ExecStartPre=/usr/libexec/docker/docker-setup-runtimes.sh (code=exited, status=0/SUCCESS)
  Process: 4296 ExecStartPre=/bin/mkdir -p /run/docker (code=exited, status=0/SUCCESS)
 Main PID: 4315 (dockerd)
    Tasks: 24
   Memory: 360.5M
   CGroup: /system.slice/docker.service
           ├─4315 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --default-ulimit nofile=32768:65536
           ├─6010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.2 -container-port 80
           └─6016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 80 -container-ip 172.17.0.2 -container-port 80

Docker 서비스가 비활성 상태인 경우 다음 명령을 실행하여 Docker 서비스를 다시 시작합니다.

sudo systemctl restart docker

참고: 위 명령을 실행하면 출력이 반환되지 않습니다.

Docker 서비스가 다시 시작되었는지 확인하려면 다음 명령을 실행합니다.

sudo systemctl status docker

컨테이너 에이전트 및 Docker의 로그 파일 검토

컨테이너 인스턴스가 여전히 연결 끊김 상태인 경우 컨테이너 호스트에서 컨테이너 에이전트 및 Docker의 로그 파일을 검토하십시오.

다음 로그 파일에서 "error", "warn" 또는 "agent transition state" 등의 키워드를 확인하십시오.

  • /var/log/ecs/ecs-agent.log 에서 Amazon ECS 컨테이너 에이전트의 최신 로그 확인 참고: /var/log/ecs/ecs-agent-log.timestamp로 필터링하여 회전된 로그를 볼 수 있습니다.
  • /var/log/ecs/ecs-init.log에서 Amazon ECS init 로그 확인
  • /var/log/cloud-init.log에서 사용자 데이터 실행 로그 확인
  • sudo journalctl -u docker 명령을 사용하여 Docker 대몬 로그 확인

Linux를 사용하는 경우 종료 코드를 검토하여 중지된 에이전트 컨테이너에 대한 자세한 내용을 확인할 수도 있습니다. 자세한 내용은 GitHub 웹 사이트의 exitcodes를 참조하십시오.

종료 코드를 가져오려면 다음 명령을 실행합니다.

docker inspect your container ID

your container ID를 중지된 컨테이너의 ID로 바꾸십시오.

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

IAM 인스턴스 프로필에 필요한 권한이 있는지 확인

컨테이너 에이전트가 여전히 연결 끊김 상태인 경우 컨테이너 인스턴스와 연결된 IAM 인스턴스 프로필에 필요한 IAM 권한이 있는지 확인합니다.

  1. SSH 또는 세션 관리자를 사용하여 인스턴스에 연결합니다.

  2. 인스턴스와 연결된 인스턴스 프로파일에서 인스턴스 메타데이터를 보려면 다음 명령을 실행합니다.

    curl http://169.254.169.254/latest/meta-data/iam/info

    출력은 다음과 유사하게 표시됩니다.

    {
      "Code" : "Success",
      "LastUpdated" : "2022-02-16T22:42:17Z",
      "InstanceProfileArn" : "arn:aws:iam::1122334455:instance-profile/ecsInstanceRole",
      "InstanceProfileId" : "AIPA4VIZXOFF55F72XIZN"
    }
  3. IAM 역할에 컨테이너 인스턴스에 대한 올바른 권한이 포함되어 있는지 확인합니다.

  4. 특정 자격 증명 오류를 확인하려면 다음과 유사한 명령을 실행하여 컨테이너 에이전트 로그에서 ECS 로그 목록을 확인합니다.

    cat /var/log/ecs/ecs-agent.log.YYYY-MM-DD-##

    **YYYY-MM-DD-##**을 관련 타임스탬프로 바꾸십시오.

참고: 컨테이너 에이전트 로그는 1시간마다 교체됩니다. 접미사는 현재 날짜 및 시간을 반영하여 자동으로 변경됩니다. 문제가 발생한 날짜 범위와 로그 ID를 포함하도록 명령을 업데이트합니다.

컨테이너 인스턴스에 ECS 에이전트를 실행하기에 충분한 리소스가 있는지 확인

작업의 메모리/CPU 사용률이 높으면 컨테이너 인스턴스에 ECS 에이전트를 실행할 리소스가 충분하지 않을 수 있습니다.

Amazon ECS 컨테이너 에이전트는 Docker ReadMemInfo() 함수를 사용하여 운영 체제에 사용할 수 있는 메모리의 양을 쿼리합니다.

컨테이너 인스턴스에서 다음 명령을 실행하여 운영 체제에서 인식하는 총 메모리를 확인합니다.

free -b

Amazon ECS 최적화 Amazon Linux AMI를 실행하는 t2.large 인스턴스의 출력 예시는 다음과 같습니다.

                          total        used         free                   shared     buff/cache    available
Mem:                    8361193472   298577920     7325388800              405504      737226752    7844274176
Swap:                     0              0           0

Amazon ECS 컨테이너 에이전트와 컨테이너 인스턴스의 기타 중요한 시스템 프로세스에 사용할 일부 메모리를 예약하도록 선택할 수 있습니다. 이 메모리를 예약하면 작업 컨테이너가 동일한 메모리를 놓고 경합하지 않도록 하는 데 도움이 됩니다. 자세한 내용은 Amazon ECS Linux 컨테이너 인스턴스 메모리 예약을 참조하십시오.

환경 변수 ECS_CLUSTER에 올바른 클러스터 이름이 있는지 확인

Amazon ECS 컨테이너 에이전트 구성 파라미터 ECS_CLUSTER에 잘못된 클러스터 이름이 있는 경우 컨테이너 인스턴스가 클러스터에 가입할 수 없습니다. /etc/ecs/ecs.config 파일의 내용을 확인하여 이 파라미터를 확인하려면 다음 명령을 실행합니다.

cat /etc/ecs/ecs.config

ECS 에이전트가 ECS 엔드포인트와 통신할 수 있는지 확인

ECS 엔드포인트와 연결하려면 네트워크 액세스 제어 목록 및 컨테이너 인스턴스 보안 그룹이 포트 443(HTTPS)의 아웃바운드 연결을 허용해야 합니다.

ECS 엔드포인트(ACS/TCS)에 대한 아웃바운드 연결을 확인하려면 컨테이너 인스턴스에서 다음 명령 중 하나를 실행합니다.

sudo yum install telnet -y$ telnet ecs.region.amazonaws.com 443

-또는-

$ curl https://ecs.region.amazonaws.com

다음 모범 사례를 검토합니다.

관련 정보

Amazon ECS 문제 해결

컨테이너 인스턴스 역할 만들기

Amazon ECS 컨테이너 에이전트 로그 보기

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

관련 콘텐츠