Amazon EC2 시작 유형을 사용하는 Amazon ECS 작업이 Application Load Balancer 상태 확인을 통과하도록 하려면 어떻게 해야 합니까?
Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 실행되는 Amazon Elastic Container Service(Amazon ECS) 작업에 대한 Application Load Balancer 상태 확인과 관련된 문제를 해결하고 싶습니다.
간략한 설명
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)((서비스 AWS-Service) (인스턴스 i-1234567890abcdefg) (포트 443)은 (대상 그룹 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)에서 (상태 확인 실패 이유)로 인해 비정상임)"
Amazon ECS 작업 콘솔에 다음 오류가 나타날 수 있습니다.
"Task failed ELB health checks in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)(작업이 (대상 그룹 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)에서 ELB 상태 확인에 실패함)"
실패한 컨테이너 상태 확인에 대해서는 Amazon ECS 작업의 컨테이너 상태 확인 실패 문제를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
Amazon ECS 작업이 중지된 이유를 확인하려면 Amazon ECS에서 중지된 작업 오류 보기 및 Amazon ECS 작업이 중지되는 이유는 무엇입니까?를 참조하십시오.
해결 방법
참고: AWS Command Line Interface(AWS CLI) 명령을 실행할 때 오류가 발생하면 AWS CLI의 오류 해결을 참조하십시오. 또한 최신 AWS CLI 버전을 사용하고 있는지 확인하십시오.
다양한 보안 그룹 구성
로드 밸런서와 컨테이너 인스턴스 또는 작업 탄력적 네트워크 인터페이스 간의 모든 트래픽을 허용하도록 다양한 보안 그룹을 구성하는 것이 가장 좋습니다. 또한 컨테이너 인스턴스가 작업에 지정된 포트에서 트래픽을 허용하도록 구성할 수 있습니다.
구성에서 다음 설정을 확인하십시오.
- 로드 밸런서와 연결된 보안 그룹은 등록된 포트에서 컨테이너 인스턴스 또는 작업 네트워크 인터페이스로의 아웃바운드 트래픽을 허용합니다. 또한 상태 확인 포트에서 컨테이너 인스턴스로의 아웃바운드 트래픽을 허용합니다.
- 로드 밸런서와 연결된 보안 그룹의 작업 호스트 포트 범위에서 인바운드 트래픽을 허용합니다.
로드 밸런서의 가용 영역 켜기
로드 밸런서에 대한 가용 영역을 구성하면 Elastic Load Balancing에서 이 가용 영역에 로드 밸런서 노드를 생성합니다. 가용 영역에 대상을 등록했지만 가용 영역을 켜지 않으면 등록된 대상에 트래픽이 수신되지 않습니다. 자세한 내용은 가용 영역 및 로드 밸런서 노드를 참조하십시오.
로드 밸런서가 구성된 가용 영역을 확인하려면 다음 단계를 완료하십시오.
- Amazon EC2 콘솔을 엽니다.
- 탐색 창의 로드 밸런싱 아래에서 로드 밸런서를 선택합니다.
- 내 Amazon ECS 서비스에서 사용 중인 로드 밸런서를 선택합니다.
- 설명 탭에서 가용 영역을 볼 수 있습니다.
또는 describe-load-balancers AWS CLI 명령을 실행합니다.
aws elbv2 describe-load-balancers --load-balancer-arns EXAMPLE-ALB-ARN --query 'LoadBalancers[*].AvailabilityZones[].{Subnet:SubnetId}'
참고: EXAMPLE-ALB-ARN을 Application Load Balancer의 ARN으로 바꾸십시오.
컨테이너 인스턴스가 구성된 가용 영역을 확인하려면 다음 단계를 완료하십시오.
- Amazon EC2 콘솔을 엽니다.
- 탐색 창에 있는 Auto Scaling에서 Auto Scaling 그룹을 선택합니다.
- 클러스터에 연결된 컨테이너 인스턴스 Auto Scaling 그룹을 선택합니다.
- 네트워크 아래 세부 정보 탭에 있는 가용 영역이 로드 밸런서의 가용 영역과 일치하는지 확인합니다.
또는 describe-auto-scaling-groups AWS CLI 명령을 실행합니다.
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names EXAMPLE-ASG-NAME --query 'AutoScalingGroups[*].{Subnets:VPCZoneIdentifier}' --output text
참고: EXAMPLE-ASG-NAME을 Auto Scaling 그룹 이름으로 바꾸십시오.
클러스터의 가용 영역을 수정하려면 다음 단계를 완료하십시오.
- AWS CloudFormation 콘솔을 엽니다.
- 클러스터의 CloudFormation 스택을 선택합니다.
- 해당 스택을 업데이트합니다.
- 스택 세부 정보 지정 페이지에서 서브넷 ID 구성을 업데이트합니다.
작업이 구성된 가용 영역을 확인하려면 다음 단계를 완료하십시오.
-
Amazon ECS 콘솔을 엽니다.
-
탐색 창에서 클러스터를 선택하고 내 서비스가 포함된 클러스터를 선택합니다.
-
클러스터 페이지의 서비스 탭에 있는 서비스 이름 열에서 확인하려는 서비스를 선택합니다.
-
구성 및 네트워킹 탭을 선택합니다.
-
네트워크 구성에서 구성된 서브넷을 확인합니다.
-
Amazon Virtual Private Cloud(Amazon VPC) 콘솔을 열어 ECS 콘솔에서 사용할 수 없는 추가 정보를 확인합니다.
-
describe-services 명령을 실행하여 서브넷의 가용 영역이 로드 밸런서의 가용 영역과 일치하는지 확인합니다.
aws ecs describe-services --cluster EXAMPLE-CLUSTER-NAME --service EXAMPLE-SERVICE-NAME --query 'services[*].deployments[].networkConfiguration[].awsvpcConfiguration.{Subnets:subnets}'
참고: EXAMPLE-CLUSTER-NAME을 클러스터 이름으로 바꾸고 EXAMPLE-SERVICE-NAME을 서비스 이름으로 바꾸십시오.
Amazon ECS 콘솔을 사용하여 Amazon ECS 서비스의 서브넷 구성을 변경할 수 없습니다. 대신 AWS CLI update-service 명령을 실행하십시오.
서브넷 간 트래픽을 허용하도록 네트워크 ACL 구성
로드 밸런서와 컨테이너 인스턴스 또는 작업 네트워크 인터페이스의 서브넷은 다를 수 있습니다.
서브넷 간 트래픽을 허용하려면 다음 네트워크 액세스 제어 목록(네트워크 ACL) 구성을 사용하십시오.
- 로드 밸런서의 서브넷과 연결된 네트워크 ACL은 임시 포트(1024-65535)와 리스너 포트에서 인바운드 트래픽을 허용해야 합니다.
- 네트워크 ACL은 상태 확인 및 임시 포트에서 아웃바운드 트래픽을 허용해야 합니다.
- 컨테이너 인스턴스의 서브넷 또는 awsvpc의 작업 네트워크 인터페이스에 연결된 네트워크 ACL은 상태 확인 포트에서 인바운드 트래픽을 허용해야 합니다.
- 네트워크 ACL은 임시 포트에서 아웃바운드 트래픽을 허용해야 합니다.
네트워크 ACL에 대한 자세한 내용은 네트워크 액세스 제어 목록으로 서브넷 트래픽 제어를 참조하십시오.
대상 그룹의 상태 확인 설정 점검
대상 그룹의 상태 확인 설정을 올바르게 구성했는지 점검하려면 다음 단계를 완료하십시오.
- Amazon EC2 콘솔을 엽니다.
- 탐색 창에 있는 로드 밸런싱에서 대상 그룹을 선택합니다.
- 내 대상 그룹을 선택합니다.
중요: 새 대상 그룹을 사용하십시오. Amazon ECS는 대상 그룹에 ECS 작업을 자동으로 등록 및 등록 취소하므로 대상 그룹에 대상을 수동으로 추가하지 마십시오. - 상태 확인 탭에서 다음 작업을 수행합니다.
포트 및 경로 필드를 올바르게 구성했는지 확인합니다.
참고: 필드를 올바르게 구성하지 않으면 상태 확인 실패로 인해 Amazon ECS에서 로드 밸런서에 작업 등록을 취소하도록 요청할 수 있습니다.
포트에서 트래픽 포트를 선택합니다.
참고: 재정의를 선택한 경우 포트가 작업 호스트 포트와 일치하는지 확인합니다.
제한 시간에서는 응답 시간 제한 값이 올바른지 확인합니다.
참고: 값이 응답에 필요한 시간보다 작으면 상태 확인이 실패합니다.
ECS 컨테이너에서 애플리케이션의 상태 및 구성 확인
애플리케이션이 로드 밸런서 상태 확인에 응답하는지 확인
다음 작업을 수행하십시오.
- 대상 그룹의 ping 포트 및 상태 확인 경로를 올바르게 구성했는지 확인합니다.
- Amazon ECS 서비스에 대한 CPU 및 메모리 사용률 지표를 모니터링합니다. 애플리케이션이 느리거나 제한 시간이 초과되면 작업 리소스 할당량을 늘리거나, 서비스를 확장하거나, 애플리케이션을 최적화하거나, 더 큰 인스턴스 유형을 사용하십시오.
- 작업을 시작한 후 서비스 스케줄러가 사전 정의된 기간 동안의 상태 확인을 무시하도록 최소 상태 확인 유예 기간을 설정합니다.
참고: Amazon ECS 작업에서는 Application Load Balancer를 등록하기 위해 더 긴 상태 확인 유예 기간이 필요할 수 있습니다. - 애플리케이션 오류를 보려면 애플리케이션 로그를 확인합니다. 자세한 내용은 CloudWatch에 Amazon ECS 로그 전송을 참조하십시오.
애플리케이션이 올바른 상태 코드를 반환하는지 확인
로드 밸런서가 상태 확인 경로에 HTTP GET 요청을 보내면 ECS 컨테이너의 애플리케이션은 기본 200 OK 상태 코드를 반환합니다. HTTP가 아닌 오류 메시지를 받으면 애플리케이션이 HTTP 트래픽을 수신하지 않는 것입니다. 선택기 설정에서 지정한 것과 다른 HTTP 상태 코드를 받을 수 있습니다. 다른 상태 코드를 받으면 애플리케이션은 HTTP 트래픽을 수신하지만 정상 대상에 대한 상태 코드를 반환하지 않는 것입니다.
참고: Application Load Balancer를 사용하는 경우 선택기 설정을 200 외 다른 상태 코드로 업데이트할 수 있습니다. 자세한 내용은 Application Load Balancer 대상 그룹의 상태 확인을 참조하십시오.
ECS 컨테이너의 애플리케이션이 올바른 상태 코드를 반환하는지 확인하려면 다음 단계를 완료하십시오.
-
SSH, AWS Systems Manager의 기능인 Session Manager 또는 EC2 인스턴스 연결을 사용하여 컨테이너 인스턴스에 연결합니다.
-
(선택 사항) 운영 체제(OS)에 대해 다음 명령을 실행하여 curl을 설치합니다.
Amazon Linux 및 기타 RPM 기반 배포판:sudo yum -y install curl
Ubuntu와 같은 Debian 기반 시스템:
sudo apt-get install curl
-
컨테이너 ID를 가져오려면 다음 명령을 실행합니다.
docker ps
참고: 로컬 리스너 포트는 시퀀스 끝에 있는 PORTS 아래 명령 출력에 표시됩니다.
-
BRIDGE 네트워크 모드를 사용하는 경우 docker inspect 명령을 실행하여 컨테이너의 IP 주소를 가져옵니다.
IPADDR=$(docker inspect --format='{{.NetworkSettings.IPAddress}}' 112233445566)
참고: 컨테이너의 IP 주소는 IPADDR에 저장됩니다. 112233445566을 docker ps 명령 출력의 컨테이너 ID 번호로 바꿉니다. awsvpc를 사용하는 경우 작업 네트워크 인터페이스에 할당된 작업 IP 주소를 사용하십시오. HOST 네트워크 모드를 사용하는 경우 작업이 노출되는 호스트 컨테이너 인스턴스의 IP 주소를 사용하십시오.
-
상태 코드를 가져오려면 IPADDR 및 로컬 리스너 포트를 포함하는 curl 명령을 실행합니다.
curl -I http://${IPADDR}:8080/health
참고: 위의 예제 명령에서 8080을 리스너 포트로 바꾸십시오.
컨테이너 인스턴스의 상태 확인
Amazon 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)((서비스 AWS-Service) (인스턴스 i-1234567890abcdefg) (포트 443)은 (대상 그룹 arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/aws-targetgroup/123456789)에서 (상태 확인 실패 이유)로 인해 비정상임)"
Amazon EC2 콘솔에서 컨테이너 인스턴스의 상태를 확인합니다. 인스턴스가 시스템 상태 검사에 실패하면 인스턴스를 중지하고 시작하십시오.
Application Load Balancer 액세스 로그를 일시적으로 활성화
Application Load Balancer 액세스 로그를 일시적으로 활성화하여 다음 문제를 확인하십시오.
- Application Load Balancer가 올바른 경로 또는 포트로 상태 확인을 전송하는지, 대상이 올바르게 응답하는지 확인합니다.
- 대상이 반환하는 HTTP 상태 코드를 분석하여 잘못 구성된 경로 또는 서버 측 오류와 같은 애플리케이션 수준 문제를 식별합니다.
- 상태 확인이 대상에 도달했는지 확인하여 네트워크 관련 문제가 있는지 확인합니다.
- 응답 시간이 구성된 상태 확인 제한 시간을 초과하는지 확인합니다.
기타 원인 문제 해결
위에 나온 해결 방법으로도 문제가 해결되지 않으면 Amazon ECS의 서비스 로드 밸런서 문제 해결을 참조하십시오.
관련 정보
Application Load Balancer의 대상 그룹 생성
로드 밸런싱을 사용하여 Amazon ECS 서비스 트래픽 분산
Application Load Balancer를 사용할 때 반환되는 504 오류를 해결하려면 어떻게 해야 합니까?
관련 콘텐츠
- 질문됨 5달 전lg...
- AWS 공식업데이트됨 3달 전
- AWS 공식업데이트됨 2달 전