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

최종 업데이트 날짜: 2022년 3월 21일

Amazon ECS(Amazon Elastic Container Service)의 컨테이너 인스턴스 연결이 해제되었습니다.

간략한 설명

정​상 작동하는 Amazon ECS 컨테이너 에이전트는 한 시간에 여러 번 연결이 해제되었다가 다시 연결될 수 있습니다. 이러한 변경 이벤트는 정상적인 상황이며, 걱정하지 않아도 됩니다. 연결 이벤트가 몇 분 동안만 계속된다면 컨테이너 에이전트 또는 컨테이너 인스턴스에 문제가 있​는 것이 아닙니다. 하지만, 컨테이너 에이전트의 연결 해제 상태가 더 오래 지속된다면 컨테이너 인스턴스는 Amazon ECS 클러스터의 멤버로 작동할 수 없습니다. 이 문제는 다음과 같은 이유로 인해 발생할 수 있습니다.

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

해결 방법

참고: 다음 해결 방법은 Amazon ECS에 최적화된 Amazon Linux 2 AMI에 적용됩니다. Amazon ECS에 최적화된 Amazon Linux 1 AMI에 적용되는 해결 방법은 Amazon ECS 컨테이너 인스턴스가 Amazon Linux 1 AMI와 연결 해제된 이유는 무엇입니까?를 참조하세요.

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

컨테이너 에이전트가 컨테이너 인스턴스에서 실행 중인지 확인

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

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

출력은 활성(실행 중)을 지정하며 다음과 유사합니다.

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

출력은 활성(실행 중)을 지정하며 다음과 유사합니다.

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에 대한 컨테이너 호스트에서 로그 파일을 검토합니다.

다음 로그 파일에서 “오류”, “경고” 또는 “에이전트 전환 상태”와 같은 키워드를 확인합니다.

  • /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 데몬 로그를 봅니다.

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

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 로그 목록에서 컨테이너 에이전트 로그를 확인합니다.

YYYY-MM-DD-**를 관련 타임스탬프로 바꿉니다.

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

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

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

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

Amazon ECS 컨테이너 에이전트는 Dokcer 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 컨테이너 에이전트용 메모리와 컨테이너 인스턴스의 기타 중요 시스템 프로세스를 위해 일부 메모리를 예약하여 작업 컨테이너가 동일한 메모리에 대해 경합하지 않도록 할 수 있습니다. 자세한 내용은 컨테이너 인스턴스 메모리 관리를 참조하세요.

환경 변수 ECS_CLUSTER의 클러스터 이름이 올바른지 확인합니다.

Amazon ECS 컨테이너 에이전트 구성 파라미터 ECS_CLUSTER의 클러스터 이름이 올바르지 않으면 컨테이너 인스턴스가 클러스터에 가입할 수 없습니다. /etc/ecs/ecs.config 파일의 내용을 확인하여 이 파라미터를 확인합니다.

cat /etc/ecs/ecs.config

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

컨테이너 인스턴스에서 사용하는 네트워크 액세스 제어 목록 및 보안 그룹은 포트 443(HTTPS)의 아웃바운드 연결이 ECS 엔드포인트에 연결할 수 있도록 허용해야 합니다.

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

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

-또는-

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

다음은 유의해야 할 몇 가지 모범 사례입니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?