Envoy용 Apigee 어댑터의 HTTP 403 금지됨 오류로 인해 Envoy 프록시가 실패함

<ph type="x-smartling-placeholder"></ph> 현재 Apigee Edge 문서를 보고 있습니다.
Apigee X 문서.
정보

증상

다음을 통해 호출 시 HTTP 403 Forbidden 오류와 함께 Envoy 프록시가 실패함 Envoy용 Apigee 어댑터

오류 메시지

다음과 같은 오류 메시지가 표시됩니다.

HTTP/1.1 403 Forbidden
content-length: 19
content-type: text/plain
date: Tue, 03 Nov 2020 00:20:10 GMT
server: istio-envoy

가능한 원인

다음 조건 중 하나가 발생하면 Envoy 프록시에서 HTTP 403 오류가 발생합니다. 발생:

원인 설명 다음에 관한 문제 해결 안내
API 제품이 사용 설정되지 않음 API 제품이 특정 환경에 사용 설정되지 않았습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
API 제품에 대상 서비스 URI 경로가 누락되었습니다. 대상 서비스의 URI 경로가 누락되었거나 API의 API 제품에 추가되지 않았습니다. 리소스를 배포합니다 에지 퍼블릭 및 프라이빗 클라우드 사용자
API 제품에 호스트 이름 누락 클라이언트 API 요청에 제공된 호스트 이름이 Apigee의 API 제품에 누락되었습니다. 원격 서비스 대상을 나타냅니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
요청 헤더에 API 키가 누락됨 API 키는 x-api-key HTTP 헤더로 전달되지 않습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
잘못된 API 키 요청의 일부로 전달된 API 키가 잘못되었습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
Envoy용 Apigee 어댑터는 원격 서비스 API 프록시와 통신 Envoy용 Apigee 어댑터가 원격 서비스 API 프록시와 통신할 수 없습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자
Envoy 프록시가 통신할 수 없음 Envoy용 Apigee 어댑터 사용 Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없습니다. 에지 퍼블릭 및 프라이빗 클라우드 사용자

시작하기 전에

  1. 다음에서 403 Forbidden 응답 메시지가 수신되고 있는지 확인합니다. Envoy 프록시 예:
    curl -i -H "x-api-key: $API_KEY" http://httpbin:8080/echo
    
    HTTP/1.1 403 Forbidden
    content-length: 19
    content-type: text/plain
    date: Tue, 12 Jan 2021 08:18:08 GMT
    server: envoy
    RBAC: access denied
    
  2. 디버그 로그를 사용 설정합니다.

    자세한 내용을 캡처하려면 Envoy용 Apigee 어댑터에서 디버그 로그를 사용 설정했는지 확인하세요. 표시합니다. 그렇지 않은 경우 Envoy용 Apigee 어댑터를 중지했다가 다시 시작하여 디버그 로그를 사용 설정합니다. 사용하여 다음 명령어를 실행합니다.

    apigee-remote-service-envoy -c config.yaml -l debug
    

원인: API 제품이 사용 설정되지 않았습니다.

이 오류는 Envoy 프록시에서 사용하는 특정 API 제품이 API 호출이 호출되는 특정 환경에 적용됩니다

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 다음 메시지가 표시되는지 확인합니다. 섹션 Authorizing request 아래에서 다음을 수행합니다.
    product: API_PRODUCT_NAME not found
    

    샘플 디버그 로그 출력:

    2021-01-12T08:18:08.124Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:18:08.124Z        DEBUG   auth/verify_api_key.go:106      fetchToken fetching: 7mQIG...
    2021-01-12T08:18:08.589Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:18:08.589Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a0600), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746037188, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:18:08.589Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo
      target: httpbin:8080
      - product: ENVOY-PRODUCT-1
        not found
    

    위의 예는 다음에서 API 제품 ENVOY-PRODUCT-1을 찾을 수 없음을 보여줍니다. Envoy용 Apigee 어댑터

    Envoy 로깅용 Apigee 어댑터에 대한 자세한 내용은 다음을 참조하세요. 로깅.

  3. API 요청을 승인하는 동안 이 메시지가 나타나면 특정 API 제품이 현재 실행 중인 특정 환경에 대해 사용 설정되지 않았음을 API 호출하기
  4. 이를 확인하려면 다음 단계를 따르세요. <ph type="x-smartling-placeholder">
      </ph>
    1. Edge UI에 로그인합니다.
    2. 게시 > API 제품 페이지에서 사용 중인 특정 API 제품을 클릭합니다. Envoy용 Apigee 어댑터를 구성하는 데 사용됩니다.
    3. API 요청을 하는 특정 환경이 API 제품에서 사용 설정되어 있습니다.
    4. API 제품에서 특정 환경이 사용 설정되지 않은 것이 원인입니다. 을 참조하세요.
  5. 특정 환경이 이미 사용 설정되어 있으면 <ph type="x-smartling-placeholder"></ph> 원인: API 제품에 대상 서비스 URI 경로가 없습니다.

해상도

API 제품에서 특정 환경이 사용 설정되지 않은 경우 다음 단계를 수행하여 문제 해결:

  1. Edge UI에 로그인합니다.
  2. 게시 > API 제품 페이지에서 사용한 특정 API 제품을 클릭합니다. Envoy용 Apigee 어댑터 구성
  3. API 제품 > 제품 이름 페이지에서 수정을 클릭합니다.
  4. 다음을 선택하여 API 요청을 할 특정 환경을 사용 설정합니다. 체크박스를 선택합니다.
  5. 저장을 클릭합니다.

원인: API 제품에 대상 서비스 URI 경로가 누락되었습니다.

이 오류는 대상의 URI 경로가 사용된 특정 API 제품에 지정되지 않은 경우 발생합니다. Envoy Proxy에서 실행합니다

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 다음 메시지가 섹션 아래에 특정 대상과 연결된 특정 API 제품에 대해 표시됩니다. Authorizing request:

    no path: REQUEST_URI_PATH
    

    샘플 디버그 로그 출력:

    2021-01-12T08:09:02.604Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:09:02.605Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:09:02.605Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a4180), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746036507, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:09:02.605Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo1
      target: httpbin:8080
      - product: ENVOY-PRODUCT-1
        no path: /echo1
    2021-01-12T08:09:02.605Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)

    샘플 출력은 다음 메시지를 보여줍니다.

    no path: /echo1
    

    API 제품에서 경로 /echo1을 찾을 수 없음을 나타냅니다. ENVOY-PRODUCT-1

  3. no path: REQUEST_URI_PATH 메시지가 표시되면 Envoy 디버그 로그용 Apigee 어댑터가 문제의 원인입니다. 그렇지 않은 경우 다음으로 이동하세요. 원인: API 제품에 호스트 이름이 누락되었습니다.

해상도

특정 요청 URI가 특정 대상의 API 제품에 추가되지 않으면 다음 단계를 따라 문제를 해결하세요.

  1. Edge UI에 로그인합니다.
  2. 게시 > API 제품 페이지에서 사용 중인 특정 API 제품을 클릭합니다. Envoy용 Apigee 어댑터를 구성하는 데 사용됩니다.
  3. API 제품 > 제품 이름 페이지에서 수정을 클릭합니다.
  4. API 리소스 창에서 API 제품에 API 요청 URI를 추가합니다.
  5. Envoy 로그용 Apigee 어댑터를 모니터링하고 Envoy용 Apigee 어댑터가 나올 때까지 기다립니다. 업데이트된 API 제품을 가져옵니다. 그런 다음 다른 API 요청을 전송하여 수정 내용을 확인합니다.

원인: API 제품에 호스트 이름 누락

이 오류는 대상 호스트 이름과 포트 조합이 지정된 Envoy 프록시에서 사용하는 API 제품입니다.

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 다음 메시지가 섹션 아래에 특정 대상과 연결된 특정 API 제품에 대해 표시됩니다. Authorizing request:

    no targets: HOSTNAME:PORT
    

    샘플 디버그 로그 출력:

    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:98 Authenticate: key: 7mQIG..., claims: map[string]interface {}(nil)
    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:125        using api key from request
    2021-01-12T08:12:06.019Z        DEBUG   auth/auth.go:157        Authenticate success: &auth.Context{Context:(*server.Handle
    r)(0xc0001a4180), ClientID:"7mQIG...", AccessToken:"", Application:"ENVOY-APP-1", APIProducts:[]string{"ENVOY-PRODUCT-1"},
    Expires:time.Time{wall:0x0, ext:63746036507, loc:(*time.Location)(0x14a3be0)}, DeveloperEmail:"[---masked---]", Scopes:[]
    string{""}, APIKey:"7mQIG..."}
    2021-01-12T08:12:06.019Z        DEBUG   product/manager.go:89
    Authorizing request:
      products: [ENVOY-PRODUCT-1]
      scopes: []
      operation: GET /echo
      target: httpbin1:8080
      - product: ENVOY-PRODUCT-1
        no targets: httpbin1:8080
    2021-01-12T08:12:06.020Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)

    위의 예는 호스트 이름과 포트 조합 httpbin1:8080을 보여줍니다. API 제품 ENVOY-PRODUCT-1에서 을(를) 찾을 수 없습니다.

  3. 요청을 승인하는 동안 Envoy 로그용 Apigee 어댑터에 no targets: HOSTNAME:PORT 메시지가 있는 항목이 포함된 경우 문제를 일으킬 수 있습니다 그렇지 않은 경우 다음으로 이동하세요. 원인: 요청 헤더에 API 키가 없습니다.

해상도

대상 호스트 이름과 포트 조합이 API 제품에 추가되지 않은 경우 다음 단계에 따라 문제를 해결하세요.

  1. Edge UI에 로그인합니다.
  2. 게시 > API 제품 페이지에서 사용 중인 특정 API 제품을 클릭합니다. Envoy용 Apigee 어댑터를 구성하는 데 사용됩니다.
  3. API 제품 > 제품 이름 페이지에서 수정을 클릭합니다.
  4. Apigee 원격 서비스 대상 창에서 대상 호스트 이름을 추가합니다. 포트를 선택하고 저장을 클릭합니다.

    UI에 Apigee 원격 서비스 대상 섹션이 표시되지 않으면 다음 명령어로 API 제품에 맞춤 속성을 추가합니다. 이름을 apigee-remote-service-targets로 지정하고 Edge API를 사용한 HOSTNAME:PORT 값 예를 들면 다음과 같습니다.

    curl https://api.enterprise.apigee.com/v1/organizations/$ORG/apiproducts/$ENVOY_PRODUCT \
        -X GET \
        -H "Authorization: Bearer $ACCESS_TOKEN" \
        -H "Content-Type:application/json" \
        -d \
    {
        "apiResources": [
            "/echo",
            "/verifyApiKey"
        ],
        "approvalType": "auto",
        "attributes": [
            {
                "name": "access",
                "value": "public"
            },
            {
                "name": "apigee-remote-service-targets",
                "value": "localhost:8080"
            }
        ],
        "createdAt": 1610435989556,
        "createdBy": "---masked---",
        "description": "",
        "displayName": "ENVOY-PRODUCT-1",
        "environments": [
            "test"
        ],
        "lastModifiedAt": 1612234134060,
        "lastModifiedBy": "---masked---",
        "name": "ENVOY-PRODUCT-1",
        "proxies": [
            "remote-service"
        ],
        "scopes": []
    }
    
    <ph type="x-smartling-placeholder">
  5. 위의 작업이 완료되면 Envoy 로그용 Apigee 어댑터를 모니터링하고 Envoy용 Apigee 어댑터가 업데이트된 API 제품을 가져옵니다. 그런 다음 다른 API를 전송합니다. 수정 확인을 요청합니다

원인: 요청 헤더에 API 키 누락

이 오류는 API 키가 요청 헤더의 일부로 전달되지 않는 경우에 발생합니다.

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 Authenticate error 아래의 [missing authentication] 메시지 섹션으로 이동합니다.

    샘플 디버그 로그 출력:

    2021-01-12T08:20:31.461Z        DEBUG   auth/auth.go:98 Authenticate: key: , claims: map[string]interface {}(nil)
    2021-01-12T08:20:31.461Z        DEBUG   auth/auth.go:159
    Authenticate error: &auth.Context{Context:(*server.Handler)
    (0xc0001a0600), ClientID:"", AccessToken:"", Application:"", APIProducts:[]string(nil), Expires:time.Time{wall:0x0, ext:0,
    loc:(*time.Location)(nil)}, DeveloperEmail:"", Scopes:[]string(nil), APIKey:""} [missing authentication]
    2021-01-12T08:20:31.461Z        DEBUG   server/authorization.go:205     sending denied: UNAUTHENTICATED
    2021-01-12T08:20:32.448Z        DEBUG   server/header_context.go:68     No context header x-apigee-api, using target header
    : :authority

    위의 샘플 출력에는 [missing authentication] 메시지가 있습니다. 이 메시지는 API 키가 요청 헤더에 사용하세요

  3. Envoy 로그용 Apigee 어댑터의 섹션 아래에 [missing authentication]라는 메시지가 있는 로그 항목이 포함된 경우 Authenticate error 입니다. 문제의 원인을 자세히 알아보세요 그렇지 않은 경우 다음으로 이동하세요. 원인: API 키가 잘못되었습니다.

해상도

[missing authentication] 오류가 표시된 경우 Envoy 로그용 Apigee 어댑터를 사용하려면 다음 단계를 수행하여 문제를 해결하세요.

  1. 클라이언트가 HTTP 헤더 x-api-key을 사용하여 API 키를 전송했는지 확인합니다. API 요청에 대응합니다 그렇지 않은 경우 클라이언트에게 HTTP 헤더의 API 키를 전송하도록 요청합니다. x-api-key
  2. Envoy 구성 파일용 Apigee 어댑터 및 기본 API 키 확인 예를 들어 다음과 같이 헤더 이름 x-api-key이(가) 변경되었습니다.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        global:
          tls:
            ...
        tenant:
          ...
        auth:
          target_header: api-key
    

    위 예에서 기본 API 키 헤더 이름이 api-key 이 경우 API 키를 헤더의 일부로 전달해야 합니다. api-key

  3. 기본 API 키 헤더 이름이 변경된 경우 업데이트된 API 키 헤더 이름을 지정하고 다른 API 요청을 보내 문제가 해결되는지 확인합니다.

원인: 잘못된 API 키

이 오류는 요청 헤더의 일부로 잘못된 API 키가 전달되었을 때 발생합니다.

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 메시지가 표시되는지 확인합니다. [permission denied] Authenticate error 섹션 아래에 있습니다. 이는 일반적으로 fetchToken fetching: API_KEY 메시지

    샘플 디버그 로그 출력:

    2021-01-12T05:01:07.198Z        DEBUG   auth/auth.go:98 Authenticate: key: 123, claims: map[string]interface {}(nil)
    2021-01-12T05:01:07.198Z        DEBUG   auth/verify_api_key.go:106      fetchToken fetching: API_KEY
    2021-01-12T05:01:09.102Z        DEBUG   server/header_context.go:68     No context header x-apigee-api, using target header: :authority
    2021-01-12T05:01:09.831Z        DEBUG   auth/auth.go:159        Authenticate error: &auth.Context{Context:(*server.Handler)(0xc0001640c0), ClientID:"", AccessToken:"", Application:"", APIProducts:[]string(nil), Expires:time.Time{wall:0x0, ext:0, loc:(*time.Location)(nil)}, DeveloperEmail:"", Scopes:[]string(nil), APIKey:""} [permission denied]
    2021-01-12T05:01:09.832Z        DEBUG   server/authorization.go:228     sending ok (actual: PERMISSION_DENIED)
    

    이 예에서 API 요청에 전송된 API 키가 잘못되었습니다.

  3. Envoy 로그용 Apigee 어댑터의 Authenticate error 섹션 아래에 [permission denied]가 있는 로그 항목이 있으면 다음을 나타냅니다. 요청의 일부로 전달된 API 키가 유효하지 않으며 이것이 문제의 원인입니다. 그렇지 않은 경우 다음으로 이동하세요. 원인: Envoy용 Apigee 어댑터 원격 서비스 API 프록시와 통신할 수 없습니다.

해상도

Envoy 로그용 Apigee 어댑터의 Authenticate error 섹션에 [permission denied] 메시지가 표시되면 다음 단계를 수행합니다. 다음 단계를 따르세요.

  1. API 요청에서 전송된 API 키와 API 제품에 연결된 애플리케이션입니다.
  2. 클라이언트에서 사용하는 API 키가 유효하지 않은 경우 유효한 API 키를 보내도록 클라이언트에 요청하세요.
  3. 클라이언트에서 사용하는 API 키가 유효하고 HTTP가 계속 표시되는 경우 403 오류가 발생했습니다. 자세히 조사하려면 Apigee Edge 지원팀에 문의하세요.

원인: Envoy용 Apigee 어댑터가 원격 서비스 API 프록시와 통신할 수 없습니다.

이 오류는 Envoy용 Apigee 어댑터가 원격 애플리케이션과 통신할 수 없는 경우에 발생합니다. 구성된 원격 서비스 호스트가 잘못된 경우 서비스 API 프록시

진단

다음 단계에 따라 문제를 진단합니다.

  1. 위의 2단계에서 설명한 대로 디버그 로그를 사용 설정합니다.
  2. Envoy 로그용 Apigee 어댑터를 확인하고 다음 메시지가 표시되는지 확인합니다.

    Error retrieving products: REQUEST_URI: no such host
    

    샘플 디버그 로그 출력:

    2021-01-12T08:29:06.499Z        DEBUG   product/manager.go:188  retrieving products from: https://foo/remote-service/products
    2021-01-12T08:29:06.505Z        ERROR   product/manager.go:164  Error retrieving products: GET "https://foo/remote-service/pro
    ducts": dial tcp: lookup foo on 169.254.169.254:53: no such host
    github.com/apigee/apigee-remote-service-golib/product.(*manager).start.func1
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/product/manager.go:164
    github.com/apigee/apigee-remote-service-golib/util.(*Looper).Run
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/util/looper.go:87
    github.com/apigee/apigee-remote-service-golib/util.(*Looper).Start.func1
            /go/pkg/mod/github.com/apigee/apigee-remote-service-golib@v1.4.0/util/looper.go:59
    

    이 예시에서 Envoy용 Apigee 어댑터는 원격 서버 API 프록시에 제공된 호스트 이름이기 때문입니다. URL이 유효하지 않습니다(no such host 오류에서 표시).

  3. Envoy 로그용 Apigee 어댑터에 no such host 메시지가 있는 로그 항목이 포함된 경우 이로 인해 문제가 발생한 것입니다. 그렇지 않은 경우 다음으로 이동하세요. <ph type="x-smartling-placeholder"></ph> 원인: Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없습니다.

해상도

Envoy 로그용 Apigee 어댑터에 위의 오류가 표시되면 다음을 수행합니다. 문제 해결 단계:

  1. Envoy 구성 파일용 Apigee 어댑터를 확인하고 지정된 원격 서비스 API 프록시 URL이 올바릅니다.

    그렇지 않은 경우 Envoy용 Apigee 어댑터를 중지하고 Envoy용 Apigee 어댑터를 시작한 다음 다른 API 요청을 보내면 문제 해결 여부를 확인합니다

    샘플 구성:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          internal_api: https://istioservices.apigee.net/edgemicro
          remote_service_api: https://ORG-ENV.apigee.net/remote-service
          org_name: ORG
          env_name: ENV
          key: KEY
          secret: SECRET
          
  2. remote-service API 프록시가 관련 Edge에 배포되었는지 확인 환경입니다 그렇지 않은 경우 관련 Edge에 remote-service API 프록시를 배포합니다. 다시 시도해 보세요
  3. Envoy용 Apigee 어댑터와 remote-service API 프록시 엔드포인트입니다. 네트워크에 연결되어 있는 경우 네트워킹 팀에 문의하여 문제를 해결하세요.

원인: Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없습니다.

진단

다음 단계에 따라 문제를 진단합니다.

  1. Envoy에서 디버그 로그를 사용 설정했는지 확인합니다. 그렇지 않으면 Envoy를 중지하고 다시 시작합니다. 디버그 로그 사용 설정 그런 다음 다른 API 요청을 보냅니다.

    독립형 배포:

    envoy -c envoy-config.yaml -l debug
    

    Kubernetes/Istio 기반 배포:

    kubectl -n=istio-system get pods
    kubectl -n=istio-system exec -it INGRESS_GATEWAY_NAME bash -- curl -X POST localhost:15000/logging?connection=debug
    
  2. Envoy 로그용 Apigee 어댑터를 확인하고 다음 메시지가 있는 로그 항목이 있는지 확인합니다.
    connecting to APIGEE_ENVOY_ADAPTER_HOST:5000
    

    이어서 다음과 같이 진행됩니다.

    upstream connect error or disconnect/reset before headers. reset reason: ACTUAL_REASON
    

    샘플 디버그 로그 출력:

    [2021-03-23 05:44:41.867][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:769] [C4] connecting to 127.0.0.1:5000
    [2021-03-23 05:44:41.867][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:785] [C4] connection in progress
    [2021-03-23 05:44:41.868][1303661][debug][http2] [external/envoy/source/common/http/http2/codec_impl.cc:1173] [C4] updating connection-level initial window size to 268435456
    [2021-03-23 05:44:41.869][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:634] [C4] delayed connection error: 111
    [2021-03-23 05:44:41.869][1303661][debug][connection] [external/envoy/source/common/network/connection_impl.cc:203] [C4] closing socket: 0
    [2021-03-23 05:44:41.869][1303661][debug][client] [external/envoy/source/common/http/codec_client.cc:96] [C4] disconnect. resetting 0 pending requests
    [2021-03-23 05:44:41.869][1303661][debug][pool] [external/envoy/source/common/conn_pool/conn_pool_base.cc:314] [C4] client disconnected, failure reason:
    [2021-03-23 05:44:41.869][1303661][debug][router] [external/envoy/source/common/router/router.cc:1031] [C0][S6149963213555558594] upstream reset: reset reason: connection failure, transport failure reason:
    [2021-03-23 05:44:41.869][1303661][debug][http] [external/envoy/source/common/http/async_client_impl.cc:100] async http request response headers (end_stream=true):
    ':status', '200'
    'content-type', 'application/grpc'
    'grpc-status', '14'
    'grpc-message', 'upstream connect error or disconnect/reset before headers. reset reason: connection failure'

    위의 예는 Envoy가 connection failure 사유로 인해 Envoy용 Apigee 어댑터입니다.

  3. connection failure은 여러 가지 이유로 발생할 수 있습니다. 각 시나리오를 살펴보겠습니다.

시나리오 #1: 어댑터 프로세스가 실행되지 않음

Envoy용 Apigee 어댑터 프로세스가 실행되고 있지 않으면 이 오류가 발생할 수 있습니다.

  1. 다음을 실행하여 Envoy용 Apigee 어댑터 프로세스가 실행 중인지 확인합니다. 명령어와 함께 사용하면 됩니다 Envoy용 Apigee 어댑터 프로세스가 실행 중인 경우의 결과는 다음과 같습니다. 명령에 나열됩니다.
    ps -ef | grep apigee-remote-service-envoy
    
  2. 실행되고 있지 않다면 문제의 원인입니다.

해상도

  1. Envoy용 Apigee 어댑터 프로세스가 실행되고 있지 않으면 Envoy용 Apigee 어댑터
  2. API를 다시 요청하고 문제가 해결되었는지 확인합니다.

시나리오 #2: 어댑터 프로세스가 특정 포트에서 수신 대기하지 않음

Envoy용 Apigee 어댑터 프로세스가 특정 포트에서 리슨하지 않는 경우 이 오류가 발생할 수 있습니다.

Envoy용 Apigee 어댑터 프로세스가 실행 중인 경우 수신 대기 중인 소켓이 있는지 확인합니다. 포트 5000: APIGEE_ENVOY_ADAPTER_HOST:5000 Cloud Shell에서 netstat 명령어를 사용하여 다음을 확인합니다.

sudo netstat -lnp | grep 5000

샘플 출력:

sudo netstat -lnp | grep 5000

tcp6       0      0 :::5000                 :::*                    LISTEN      1596530/./apigee-re

포트 5000에서 수신 대기하는 소켓이 없는 경우 이 문제가 발생한 것일 수 있습니다.

해상도

  1. Envoy용 Apigee 어댑터를 중지했다가 다시 시작합니다.
  2. API를 다시 요청하고 문제가 해결되었는지 확인합니다.

시나리오 #3: Envoy와 Envoy용 Apigee 어댑터 간의 네트워크 연결

  1. Envoy와 Envoy용 Apigee 어댑터 간의 네트워크 연결을 확인합니다.
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    telnet이 Envoy용 Apigee 어댑터에 TCP를 연결할 수 있는지 여부 다음과 비슷한 출력이 표시됩니다.

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    
  2. telnet 사용 시 Connection timed out 오류가 발생하면 Envoy와 Envoy용 Apigee 어댑터 간에 네트워크 연결 문제가 있습니다.

해상도

Envoy와 Envoy용 Apigee 어댑터 간에 네트워크 연결 문제가 있는 경우 네트워킹 팀을 참여시켜 문제를 해결하십시오.

문제가 계속되면 진단 정보를 수집해야 합니다.

진단 정보 수집 필요

위의 안내를 따른 후에도 문제가 지속되면 다음 진단 자료를 수집하세요. 다음 Apigee Edge 지원팀에 문의하세요.

  1. 사용된 Apigee 제품:

    예: Apigee Edge Cloud, Apigee OPDK, Apigee Hybrid, Apigee X

  2. Apigee 조직 및 환경
  3. Edge API를 사용하여 읽은 API 제품 정의입니다.

    curl -i -u $USER:$PASSWORD $MANAGEMENT_SERVER_ENDPOINT/v1/organizations/$ORGANIZATION/apiproducts/$API_PRODUCT

    참조: Apigee Edge API

  4. 다음을 사용하여 remote-service API 프록시에서 트레이스 세션을 시작합니다. Apigee Edge UI입니다. 이 문제를 재현하고 추적 세션 XML 파일을 공유하세요.

    참조: 추적 도구 사용 | Apigee Edge

  5. Envoy 로그용 Apigee 어댑터 (지정된 기간과 관련된 전체 로그)

    독립형 배포:

    # by default Apigee Envoy write logs to stdout and stderr, check your deployment configuration and collect logs accordingly
    

    Kubernetes/Istio 기반 배포:

    kubectl -n=apigee get pods
    kubectl -n=apigee logs APIGEE_REMOTE_SERVICE_ENVOY_POD_NAME > apigee-remote-service-envoy.log
  6. curl 명령어를 사용하여 Envoy 프록시에 전송된 API 요청 (curl 명령어의 전체 출력):
    curl -v ENVOY_PROXY_ENDPOINT
  7. curl 명령어를 사용하여 대상 서비스로 전송되는 API 요청 (전체 curl 명령어의 출력)
    curl -v TARGET_SERVICE_ENDPOINT