Amazon ECS의 Application Load Balancer 상태 확인을 통과하도록 Amazon EC2 시작 유형을 사용하여 Amazon ECS 작업을 실행하려면 어떻게 해야 하나요?

8분 분량
0

Amazon Elastic Container Service(Amazon ECS)의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대한 Application Load Balancer 상태 확인에서 비정상 상태를 반환합니다. EC2 인스턴스가 상태 확인을 통과하도록 하고 싶습니다.

간략한 설명

Amazon ECS 작업이 로드 밸런서 상태 확인에 실패하면 Amazon ECS 서비스 이벤트 메시지에 다음 오류 중 하나가 나타납니다.

  • "(service AWS-service) (port 8080) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed with these codes: [502 or 504]) or (request timeout)"
  • "(service AWS-Service) (port 8080) is unhealthy in target-group tf-20190411170 due to (reason Health checks failed)"
  • "(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

Amazon ECS 작업 콘솔에 다음 오류가 나타날 수도 있습니다.

"Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)"

"(service AWS-Service) (task c13b4cb40f1f4fe4a2971f76ae5a47ad) failed container health checks," 오류가 나타나는 경우, Amazon ECS 작업에서 컨테이너 상태 확인 실패 문제를 어떻게 해결하나요?를 참고하세요.

참고: Amazon ECS 작업에서 비정상 상태를 반환하는 이유에는 여러가지가 있습니다. 다음 단계를 실행해도 문제가 해결되지 않으면 서비스 로드 밸런서 문제 해결을 참고하세요. ECS 작업이 중지된 이유를 알아보려면 중지된 작업의 오류 확인을 참고하세요.

해결 방법

참고: AWS Command Line Interface(AWS CLI) 명령 실행 시 오류가 발생하는 경우, AWS CLI 오류 문제 해결을 참고하세요. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하세요.

Amazon ECS 작업에서 로드 밸런서 상태 확인 문제를 해결하고 Application Load Balancer 상태 확인을 통과하려면 다음을 확인하세요.

  • 로드 밸런서와 Amazon ECS 작업 간 연결 상태
  • 대상 그룹의 상태 확인 설정
  • ECS 컨테이너에서 애플리케이션 상태 및 구성
  • 컨테이너 인스턴스의 상태

로드 밸런서와 Amazon ECS 작업 간의 연결 상태 확인

로드 밸런서가 Amazon ECS 작업에 대한 상태 확인을 할 수 있도록 허용하려면 다음 정보를 검토하세요.

로드 밸런서와 컨테이너 인스턴스 또는 awsvpc 네트워크 모드용 ECS 작업 탄력적 네트워크 인터페이스에 연결된 보안 그룹이 올바르게 구성되어 있는지 확인

로드 밸런서와 컨테이너 인스턴스 또는 탄력적 네트워크 인터페이스에 다른 보안 그룹을 구성하는 것이 가장 좋습니다. 그러면 로드 밸런서와 컨테이너 인스턴스 또는 탄력적 네트워크 인터페이스 간의 모든 트래픽을 허용할 수 있습니다. 또한 컨테이너 인스턴스가 작업에 지정된 포트 트래픽을 허용하도록 설정할 수 있습니다.

  • 로드 밸런서와 연결된 보안 그룹에서 등록된 포트의 컨테이너 인스턴스 또는 작업 탄력적 네트워크 인터페이스로 송신 트래픽을 허용하는지 확인하세요. 해당되는 경우 컨테이너 인스턴스와 연결된 상태 확인 포트에서도 이를 허용하는지 확인하세요.
  • 컨테이너 인스턴스 또는 작업 탄력적 네트워크 인터페이스와 연결된 보안 그룹에서 로드 밸런서와 연결된 보안 그룹의 수신 트래픽을 작업 호스트 포트 범위 내에서 모두 허용하는지 확인하세요. 로드 밸런서와 연결된 보안 그룹을 확인하려면 Application Load Balancer용 보안 그룹을 참고하세요.

중요: 동적 포트 매핑을 사용하는 경우 서비스는 호스트 포트가 아닌 동적 포트(일반적으로 포트 32768~65535)에 노출됩니다. 이 경우 컨테이너 인스턴스 보안 그룹에서 로드 밸런서의 수신 규칙에 임시 포트 범위를 소스로 반영하는지 확인하세요.

로드 밸런서가 컨테이너 인스턴스 또는 awsvpc 네트워크 모드용 ECS 작업 탄력적 네트워크 인터페이스와 동일한 가용 영역에 구성되어 있습니다

로드 밸런서에 대한 가용 영역을 활성화하면 Elastic Load Balancing에서 이 가용 영역에 로드 밸런서 노드를 생성합니다. 가용 영역에 대상을 등록했지만 가용 영역을 켜지 않으면 이렇게 등록된 대상에 트래픽이 수신되지 않습니다. 자세한 내용은 가용 영역 및 로드 밸런서 노드를 참고하세요.

로드 밸런서가 구성된 가용 영역을 확인하려면 다음 단계를 완료하세요.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에 있는 로드 밸런싱 아래에서 로드 밸런서를 선택합니다.
  3. 내 Amazon ECS 서비스에서 사용 중인 로드 밸런서를 선택합니다.
  4. 설명 탭에 있는 가용 영역 필드에서 가용 영역을 확인할 수 있습니다.

참고: Application Load Balancer의 경우 언제든지 가용 영역을 활성화하거나 비활성화할 수 있습니다. Network Load Balancer의 경우 가용 영역을 활성화한 후에는 다시 비활성화할 수 없으나 가용 영역을 추가로 활성화할 수는 있습니다.

Application Load Balancer를 사용하는 경우 교차 영역 로드 밸런싱은 항상 켜져 있습니다. Network Load Balancer를 사용하는 경우 교차 영역 로드 밸런싱은 기본적으로 꺼져 있습니다. Network Load Balancer를 생성한 후에는 언제든지 교차 영역 로드 밸런싱을 켜거나 끌 수 있습니다. 자세한 내용은 Elastic Load Balancing 작동 방식을 참고하세요.

컨테이너 인스턴스가 구성된 가용 영역을 확인하려면 다음 단계를 완료하세요.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에 있는 Auto Scaling에서 Auto Scaling 그룹을 선택합니다.
  3. 클러스터에 연결된 컨테이너 인스턴스 Auto Scaling 그룹을 선택합니다.
  4. 네트워크 아래 세부 정보 탭에 있는 가용 영역 목록이 로드 밸런서에 있는 가용 영역 목록과 일치하는지 확인합니다.

클러스터 가용 영역을 수정하려면 AWS CloudFormation 콘솔을 열고 내 클러스터에 대한 CloudFormation 스택을 선택한 후 서브넷 구성을 업데이트합니다. awsvpc용 작업 탄력적 네트워크 인터페이스가 구성된 가용 영역을 확인하려면 다음 단계를 완료하세요.

  1. Amazon ECS 콘솔을 엽니다.
  2. 탐색 창에서 클러스터를 선택하고 내 서비스가 포함된 클러스터를 선택합니다.
  3. 클러스터 페이지의 서비스 탭에 있는 서비스 이름 열에서 확인하려는 서비스를 선택합니다.
  4. 세부 정보를 선택하고 허용된 서브넷을 선택하면 서비스에 대해 활성화된 서브넷을 볼 수 있습니다.
  5. Amazon VPC 콘솔에서 서브넷을 볼 수 있습니다.
  6. 서브넷의 가용 영역이 로드 밸런서에 나열된 가용 영역과 일치하는지 확인하세요.

참고: Amazon ECS 콘솔에서는 Amazon ECS 서비스의 서브넷 구성을 변경할 수 없습니다. AWS CLI update-service 명령을 사용하여 서브넷 구성을 변경할 수 있습니다.

내 로드 밸런서의 서브넷과 연결된 네트워크 액세스 제어 목록(ACL)과 ECS 컨테이너 인스턴스 또는 awsvpc 네트워크 모드용 ECS 탄력적 네트워크 인터페이스가 올바르게 구성되어 있습니다

로드 밸런서와 컨테이너 인스턴스 또는 작업 탄력적 네트워크 인터페이스의 서브넷이 다를 수 있습니다. 이러한 서브넷 간에 트래픽이 허용되는지 확인하려면 다음을 확인하세요.

  • 로드 밸런서의 서브넷과 연결된 네트워크 ACL이 임시 포트(1024~65535)와 리스너 포트의 수신 트래픽을 허용하는지 확인하세요. 네트워크 ACL이 상태 확인 및 임시 포트의 송신 트래픽도 허용하는지 확인하세요.
  • 컨테이너 인스턴스의 서브넷이나 awsvpc 모드용 작업 탄력적 네트워크 인터페이스와 연결된 네트워크 ACL이 상태 확인 포트의 송신 트래픽을 허용하는지 확인하세요. 네트워크 ACL이 임시 포트의 송신 트래픽을 허용하는지 확인합니다.

네트워크 ACL에 대한 자세한 내용은 네트워크 ACL 사용을 참고하세요.

대상 그룹의 상태 확인 설정 점검

대상 그룹의 상태 확인 설정이 올바르게 구성되었는지 확인하려면 다음 단계를 완료하세요.

  1. Amazon EC2 콘솔을 엽니다.
  2. 탐색 창에 있는 로드 밸런싱에서 대상 그룹을 선택합니다.
  3. 내 대상 그룹을 선택합니다.
    중요: 새 대상 그룹을 사용하세요. Amazon ECS에서 자동으로 대상 그룹에 컨테이너를 등록 및 등록 취소하므로 대상 그룹에 수동으로 대상을 추가하지 마세요.
  4. 상태 확인 탭에서 다음 정보를 입력합니다.
    포트경로 필드가 올바르게 구성되었는지 확인합니다. 포트 필드 구성이 올바르지 않은 경우 로드 밸런서에서 컨테이너 등록을 취소할 수 있습니다.
    포트에서 트래픽 포트를 선택합니다.
    참고: 재정의를 선택한 경우 지정된 포트가 작업 호스트 포트와 일치하는지 확인합니다.
    제한 시간에서는 응답 시간 제한 값이 올바르게 설정되어 있는지 확인합니다.
    참고: 응답 시간 제한은 컨테이너에서 상태 확인 ping에 응답을 반환하는 데 걸리는 시간입니다. 이 값이 응답에 필요한 시간보다 낮으면 상태 확인이 실패합니다.

ECS 컨테이너에서 애플리케이션의 상태 및 구성 확인

내 ECS 컨테이너의 애플리케이션이 로드 밸런서 상태 확인에 응답하는지 확인

ECS 컨테이너의 애플리케이션이 로드 밸런서 상태 확인에 올바르게 응답하도록 하려면 다음 작업을 완료하세요.

  • 대상 그룹의 ping 포트 및 상태 확인 경로가 올바르게 구성되었는지 확인합니다.
  • ECS 서비스에 대한 CPU 및 메모리 사용률 지표를 모니터링합니다. 예를 들어 CPU가 높으면 애플리케이션이 응답하지 않고 502 오류나 시간 초과가 발생할 수 있습니다.
  • 상태 확인 유예 기간의 최소 기간을 정의합니다. 이렇게 설정하면 작업이 인스턴스화된 후 사전 정의된 기간 동안 Elastic Load Balancing 상태 확인을 무시하도록 서비스 스케줄러가 설정됩니다. Amazon ECS 작업에서는 Network Load Balancer를 등록하기 위해 상태 확인 유예 기간이 더 길게 필요할 수 있습니다.
  • 애플리케이션 오류를 보려면 애플리케이션 로그를 확인하세요. 자세한 내용은 CloudWatch 로그에서 awslogs 컨테이너 로그 보기를 참고하세요.

ECS 컨테이너의 애플리케이션이 올바른 응답 코드를 반환하는지 확인

로드 밸런서에서 상태 확인 경로에 HTTP GET 요청을 보내면 내 ECS 컨테이너에 있는 애플리케이션에서 200 OK 응답 코드를 기본적으로 반환합니다.

참고: Application Load Balancer를 사용하는 경우 선택기 설정을 200 외 다른 응답 코드로 업데이트할 수 있습니다. 자세한 내용은 대상 그룹의 상태 확인을 참고하세요.

  1. SSH를 사용하여 컨테이너 인스턴스에 연결합니다.

  2. (선택 사항)시스템에 적합한 명령으로 curl을 설치합니다.
    Amazon Linux 및 기타 RPM 기반 배포일 경우 다음 명령을 실행합니다.

    sudo yum -y install curl

    Debian 기반 시스템(예: Ubuntu)에서는 다음 명령을 실행합니다.

    sudo apt-get install curl
  3. 컨테이너 ID를 가져오려면 다음 명령을 실행합니다.

    docker ps

    참고: 로컬 리스너 포트는 시퀀스 끝에 있는 PORTS 아래 명령 출력에 표시됩니다.

  4. 컨테이너의 IP 주소를 가져오려면 docker inspect 명령을 실행합니다.

    $ IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)

    참고: 컨테이너 IP 주소는 IPADDR에 저장됩니다. BRIDGE 네트워크 모드를 사용하는 경우에만 이 명령을 사용하세요. 112233445566을 컨테이너의 ID 번호로 교체하세요.
    awsvpc 네트워크 모드를 사용하는 경우 작업 탄력적 네트워크 인터페이스에 할당된 작업 IP 주소를 사용하세요. HOST 네트워크 모드를 사용하는 경우 작업이 노출된 호스트 IP 주소를 사용하세요.

  5. 상태 코드를 가져오려면 IPADDR 및 로컬 리스너 포트를 포함하는 curl 명령을 실행합니다. 예를 들어, 상태 확인 경로가 /health인 포트 8080에서 수신 중인 컨테이너에서 curl 명령을 실행하는 경우, 명령이 응답 코드 200 OK를 반환해야 합니다.

    curl -I http://${IPADDR}:8080/health

    HTTP가 아닌 오류 메시지를 수신하면 애플리케이션이 HTTP 트래픽을 수신하지 않는 것입니다. 선택기 설정에서 지정한 것과 다른 HTTP 상태 코드를 수신하는 경우, 애플리케이션에서 HTTP 트래픽을 수신은 하지만 정상 대상에 상태 코드를 반환하지 않는 것입니다.

컨테이너 인스턴스의 상태 확인

AWS ECS 서비스 이벤트에서 다음과 같은 이벤트 메시지를 받는다고 가정해 보겠습니다.

"(service AWS-Service) (instance i-1234567890abcdefg) (port 443) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789) due to (reason Health checks failed)"

Amazon EC2 콘솔에서 상태 확인 보기를 통해 컨테이너 인스턴스의 상태를 확인합니다. 인스턴스가 시스템 상태 확인에 실패하면 인스턴스를 중지하고 다시 시작해 보세요.

관련 정보

라우팅을 위한 대상 그룹 구성

서비스 로드 밸런싱

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

관련 콘텐츠