App Mesh 설치 문제 해결 - AWS App Mesh

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

App Mesh 설치 문제 해결

이 주제에서는 App Mesh 설치 시 발생할 수 있는 일반적인 문제를 자세히 설명합니다.

Envoy 컨테이너 이미지를 끌어올 수 없음

증상

Amazon ECS 태스크에서 다음 오류 메시지가 나타납니다. 다음 메시지의 Amazon ECR 계정 ID리전은 컨테이너 이미지를 끌어온 원본 Amazon ECR 리포지토리에 따라 다를 수 있습니다.

CannotPullContainerError: Error response from daemon: pull access denied for 840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy, repository does not exist or may require 'docker login'
해결 방법

이 오류는 사용 중인 태스크 실행 역할에 Amazon ECR과 통신할 권한이 없으며 리포지토리에서 Envoy 컨테이너 이미지를 끌어올 수 없음을 나타냅니다. Amazon ECS 태스크에 할당된 태스크 실행 역할에는 다음 명령문이 포함된 IAM 정책이 필요합니다.

{ "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": "arn:aws:ecr:us-west-2:111122223333:repository/aws-appmesh-envoy", "Effect": "Allow" }, { "Action": "ecr:GetAuthorizationToken", "Resource": "*", "Effect": "Allow" }

문제가 여전히 해결되지 않으면 문제를 제기하거나 AWS Support에 GitHub 문의하세요.

App Mesh Envoy Management Service에 연결할 수 없음

증상

Envoy 프록시가 App Mesh Envoy Management Service에 연결할 수 없습니다. 현재 표시되는 내용은 다음과 같습니다.

  • 연결 거부 오류

  • 연결 시간 초과

  • App Mesh Envoy Management Service 엔드포인트를 확인하는 동안 오류 발생

  • gRPC 오류

해결 방법

Envoy 프록시가 인터넷 또는 프라이빗 VPC 엔드포인트에 액세스할 수 있고 보안 그룹이 포트 443에서 아웃바운드 트래픽을 허용하는지 확인합니다. App Mesh의 퍼블릭 Envoy Management Service 엔드포인트는 정규화된 도메인 이름(FQDN) 형식을 따릅니다.

# App Mesh Production Endpoint appmesh-envoy-management.Region-code.amazonaws.com # App Mesh Preview Endpoint appmesh-preview-envoy-management.Region-code.amazonaws.com

아래 명령을 사용하여 EMS 연결을 디버깅할 수 있습니다. 이렇게 하면 유효하지만 비어 있는 gRPC 요청이 Envoy Management Service에 전송됩니다.

curl -v -k -H 'Content-Type: application/grpc' -X POST https://appmesh-envoy-management.Region-code.amazonaws.com:443/envoy.service.discovery.v3.AggregatedDiscoveryService/StreamAggregatedResources

이러한 메시지를 다시 받으면 Envoy Management Service에 대한 연결이 정상적으로 작동합니다. gRPC 관련 오류를 디버깅하려면 Envoy가 오류 텍스트를 나타내며 App Mesh Envoy Management Service에서 연결이 끊김을 참조하세요.

grpc-status: 16 grpc-message: Missing Authentication Token

문제가 여전히 해결되지 않으면 문제를 제기하거나 AWS Support에 GitHub 문의하세요.

Envoy가 오류 텍스트를 나타내며 App Mesh Envoy Management Service에서 연결이 끊김

증상

Envoy 프록시가 App Mesh Envoy Management Service에 연결하여 해당 구성을 받을 수 없습니다. Envoy 프록시 로그에는 다음과 같은 로그 항목이 포함되어 있습니다.

gRPC config stream closed: gRPC status code, message
해결 방법

대부분의 경우 로그의 메시지 부분에 문제가 표시되어야 합니다. 다음 표에는 표시될 수 있는 가장 일반적인 gRPC 상태 코드, 원인 및 해결 방법이 나와 있습니다.

gRPC 상태 코드 원인 해결 방법
0 Envoy Management Service와의 연결을 정상적으로 끊습니다. 문제가 없습니다. App Mesh는 이 상태 코드를 사용하여 Envoy 프록시의 연결을 끊는 경우가 있습니다. Envoy는 다시 연결하여 업데이트를 계속 받습니다.
3 메시 엔드포인트(가상 노드 또는 가상 게이트웨이) 또는 관련 리소스 중 하나를 찾을 수 없습니다. Envoy 구성을 다시 확인하여 해당 구성이 나타내는 App Mesh 리소스의 적절한 이름이 있는지 확인합니다. App Mesh 리소스가 다른 리소스 (예: AWS Cloud Map 네임스페이스 또는 ACM 인증서) 와 통합되어 있는 경우 해당 AWS 리소스가 존재하는지 확인하세요.
7 Envoy 프록시는 Envoy Management Service에 연결하거나 관련 리소스를 검색하는 등의 작업을 수행할 권한이 없습니다. App Mesh 및 기타 서비스에 대한 적절한 정책 설명이 포함된 IAM 정책을 생성하고 해당 정책을 Envoy 프록시가 Envoy Management Service에 연결하는 데 사용하는 IAM 사용자 또는 역할에 연결해야 합니다.
8 특정 App Mesh 리소스의 Envoy 프록시 수가 계정 수준 서비스 할당량을 초과합니다. 기본 계정 할당량과 할당량 증가를 요청하는 방법에 대한 자세한 내용은 App Mesh 서비스 할당량 섹션을 참조하세요.
16 Envoy 프록시에는 AWS에 대한 유효한 인증 자격 증명이 없습니다. Envoy가 IAM 사용자 또는 역할을 통해 AWS 서비스에 연결할 수 있는 적절한 자격 증명을 가지고 있는지 확인합니다. Envoy 프로세스에서 1024 이상의 파일 설명자를 사용하는 경우 버전 v1.24 이하의 Envoy에서 알려진 문제인 #24136으로 인해 자격 증명을 가져오지 못합니다. 이 문제는 Envoy가 높은 트래픽 볼륨을 제공할 때 발생합니다. 디버그 수준에서 Envoy 로그의 텍스트 "A libcurl function was given a bad argument“를 확인하여 이 문제를 확인할 수 있습니다. 이 문제를 완화하려면 Envoy 버전 v1.25.1.0-prod 이상으로 업그레이드하세요.

Amazon CloudWatch Insights에서 다음 쿼리를 사용하여 Envoy 프록시의 상태 코드 및 메시지를 관찰할 수 있습니다.

filter @message like /gRPC config stream closed/ | parse @message "gRPC config stream closed: *, *" as StatusCode, Message

제공된 오류 메시지가 도움이 되지 않았거나 문제가 여전히 해결되지 않은 경우 문제를 여는 것을 고려해 보십시오. GitHub

Envoy 컨테이너 상태 확인, 준비 상태 프로브 또는 활성화 프로브 실패

증상

Envoy 프록시가 Amazon ECS 태스크, Amazon EC2 인스턴스 또는 Kubernetes 포드에서 상태 확인에 실패합니다. 예를 들어, 다음 명령으로 Envoy 관리 인터페이스를 쿼리하면 LIVE 이외의 상태가 표시됩니다.

curl -s http://my-app.default.svc.cluster.local:9901/server_info | jq '.state'
해결 방법

다음은 Envoy 프록시가 반환하는 상태에 따른 수정 단계 목록입니다.

  • PRE_INITIALIZING 또는 INITIALIZING - Envoy 프록시가 아직 구성을 받지 않았거나 App Mesh Envoy Management Service에 연결하여 구성을 검색할 수 없습니다. 연결을 시도할 때 Envoy는 Envoy Management Service에서 오류를 수신할 수 있습니다. 자세한 내용은 Envoy가 오류 텍스트를 나타내며 App Mesh Envoy Management Service에서 연결이 끊김의 오류를 참조하세요.

  • DRAINING - Envoy 프록시는 Envoy 관리 인터페이스의 /healthcheck/fail 또는 /drain_listeners 요청에 대한 응답으로 연결을 드레이닝하기 시작했습니다. Amazon ECS 태스크, Amazon EC2 인스턴스 또는 Kubernetes 포드를 종료하려는 경우가 아니면 관리 인터페이스에서 이러한 경로를 호출하지 않는 것이 좋습니다.

문제가 여전히 해결되지 않으면 문제를 제기하거나 AWS Support에 GitHub 문의하세요.

로드 밸런서에서 메시 엔드포인트로의 상태 확인이 실패함

증상

컨테이너 상태 확인 또는 준비 상태 프로브에서 메시 엔드포인트가 정상으로 간주되지만 로드 밸런서에서 메시 엔드포인트로의 상태 확인이 실패합니다.

해결 방법

이 문제를 해결하려면 다음 태스크를 완료합니다.

  • 메시 엔드포인트와 연결된 보안 그룹이 상태 확인을 위해 구성한 포트의 인바운드 트래픽을 수락하는지 확인합니다.

  • 수동으로 요청할 경우(예: VPC 내 Bastion Host에서) 상태 확인이 일관되게 성공하는지 확인하세요.

  • 가상 노드의 상태 확인을 구성하는 경우 애플리케이션에 상태 확인 엔드포인트를 구현하는 것이 좋습니다(예: HTTP의 경우 /ping). 이렇게 하면 Envoy 프록시와 애플리케이션 모두 로드 밸런서에서 라우팅할 수 있습니다.

  • 필요한 기능에 따라 가상 노드에 모든 유형의 Elastic Load Balancer를 사용할 수 있습니다. 자세한 내용은 Elastic Load Balancing 기능을 참조하세요.

  • 가상 게이트웨이에 대해 상태 확인을 구성하는 경우 가상 게이트웨이의 수신기 포트에 대한 TCP 또는 TLS 상태 확인에 Network Load Balancer를 사용하는 것이 좋습니다. 이렇게 하면 가상 게이트웨이 리스너가 부트스트랩되어 연결을 수락할 준비가 됩니다.

문제가 여전히 해결되지 않으면 문제를 제기하거나 AWS Support에 GitHub 문의하세요.

가상 게이트웨이는 포트 1024 이하에서 트래픽을 허용하지 않음

증상

가상 게이트웨이는 포트 1024 이하에서는 트래픽을 허용하지 않지만 1024보다 큰 포트 번호에서는 트래픽을 허용합니다. 예를 들어 다음 명령으로 Envoy 통계를 쿼리하면 0이 아닌 값이 수신됩니다.

curl -s http://my-app.default.svc.cluster.local:9901/stats | grep "update_rejected"

로그에서 권한 있는 포트에 바인딩하지 못했음을 설명하는 다음 텍스트와 비슷한 텍스트가 표시될 수 있습니다.

gRPC config for type.googleapis.com/envoy.api.v2.Listener rejected: Error adding/updating listener(s) lds_ingress_0.0.0.0_port_<port num>: cannot bind '0.0.0.0:<port num>': Permission denied
해결 방법

이 문제를 해결하려면 게이트웨이에 지정된 사용자에게 Linux 기능 CAP_NET_BIND_SERVICE가 있어야 합니다. 자세한 내용은 Linux 프로그래머 설명서의 기능, ECS 태스크 정의 파라미터의 Linux 파라미터 및 Kubernetes 설명서의 컨테이너 기능 설정을 참조하세요.

중요

Fargate는 1024보다 큰 포트 값을 사용해야 합니다.

문제가 여전히 해결되지 않으면 문제를 제기하거나 AWS Support에 GitHub 문의하세요.