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

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

증상

Envoy용 Apigee 어댑터를 통해 호출할 때 Envoy 프록시가 HTTP 403 Forbidden 오류와 함께 실패합니다.

오류 메시지

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

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 제품이 특정 환경에 사용 설정되지 않았습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
API 제품에 대상 서비스 URI 경로가 없습니다. 대상 서비스의 URI 경로가 누락되었거나 API 리소스의 API 제품에 추가되지 않았습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
API 제품에 호스트 이름 누락 클라이언트 API 요청에 지정된 호스트 이름이 Apigee 원격 서비스 대상의 API 제품에 없습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
요청 헤더에 API 키 누락 API 키는 x-api-key HTTP 헤더에 전달되지 않습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
잘못된 API 키 요청의 일부로 전달된 API 키가 잘못되었습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
Envoy용 Apigee 어댑터가 원격 서비스 API 프록시와 통신할 수 없음 Envoy용 Apigee 어댑터가 원격 서비스 API 프록시와 통신할 수 없습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자
Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없음 Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없습니다. Edge 퍼블릭 및 프라이빗 클라우드 사용자

시작하기 전에

  1. Envoy 프록시에서 403 Forbidden 응답 메시지를 받는지 확인합니다. 예:
    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 어댑터에 대한 자세한 내용은 Logging을 참조하세요.

  3. API 요청을 승인하는 동안 이 메시지가 표시되면 API를 호출하는 특정 환경에 해당 API 제품이 사용 설정되지 않았음을 나타냅니다.
  4. 이를 확인하려면 다음 단계를 따르세요.
    1. Edge UI에 로그인합니다.
    2. 게시 > API 제품 페이지에서 Envoy용 Apigee 어댑터를 구성하는 데 사용한 특정 API 제품을 클릭합니다.
    3. API 요청을 하는 특정 환경이 API 제품에서 사용 설정되어 있는지 확인합니다.
    4. API 제품에 특정 환경이 사용 설정되지 않은 경우 이로 인해 이 문제가 발생합니다.
  5. 특정 환경이 이미 사용 설정된 경우 원인: API 제품에 대상 서비스 URI 경로 누락으로 이동하세요.

해상도

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

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

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

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

진단

문제를 진단하려면 다음 단계를 따르세요.

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

    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 제품 ENVOY-PRODUCT-1에서 경로 /echo1를 찾을 수 없음을 나타냅니다.

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

해상도

특정 요청 URI가 특정 대상의 API 제품에 추가되지 않으면 다음 단계를 수행하여 문제를 해결합니다.

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

원인: API 제품에 호스트 이름이 누락되었습니다.

이 오류는 대상 호스트 이름과 포트 조합이 Envoy 프록시에서 사용하는 특정 API 제품에 추가되지 않은 경우에 발생합니다.

진단

문제를 진단하려면 다음 단계를 따르세요.

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

    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)

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

  3. 요청을 승인하는 동안 Envoy 로그용 Apigee 어댑터에 no targets: HOSTNAME:PORT 메시지가 포함된 항목이 포함되면 이 항목이 문제의 원인입니다. 그렇지 않은 경우 원인: 요청 헤더에 API 키 누락으로 이동합니다.

해상도

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

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

    UI에 Apigee 원격 서비스 대상 섹션이 표시되지 않으면 이름이 apigee-remote-service-targets인 API 제품에 커스텀 속성을 추가하고 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": []
    }
    
  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 어댑터의 Authenticate error 섹션에 [missing authentication]라는 메시지가 있는 로그 항목이 포함되어 있으면 이것이 문제의 원인입니다. 그렇지 않으면 원인: 잘못된 API 키로 이동합니다.

해상도

Envoy 로그용 Apigee 어댑터에 [missing authentication] 오류가 표시되면 다음 단계를 수행하여 문제를 해결합니다.

  1. 클라이언트가 API 요청에서 HTTP 헤더 x-api-key를 사용하여 API 키를 전송했는지 확인합니다. 그렇지 않은 경우 클라이언트에 HTTP 헤더 x-api-key의 API 키를 전송하도록 요청합니다.
  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 어댑터를 확인하고 Authenticate error 섹션에 [permission denied] 메시지가 표시되는지 확인합니다. 일반적으로 fetchToken fetching: API_KEY 메시지로 표시되는 어댑터에서 API 키를 가져온 후에 표시됩니다.

    샘플 디버그 로그 출력:

    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 제품에 연결된 애플리케이션에서 찾은 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 오류로 표시된 대로 유효하지 않으므로 원격 서비스 API 프록시와 통신할 수 없습니다 .

  3. Envoy 로그용 Apigee 어댑터에 no such host 메시지가 있는 로그 항목이 포함되면 이 문제로 인해 문제가 발생한 것입니다. 그렇지 않은 경우 원인: Envoy 프록시가 Envoy용 Apigee 어댑터와 통신할 수 없습니다로 이동합니다.

해상도

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

  1. Envoy용 Apigee 어댑터 구성 파일을 확인하고 지정된 원격 서비스 API 프록시 URL이 유효한지 확인하세요.

    그렇지 않은 경우 Envoy용 Apigee 어댑터를 중지하고 구성 파일에서 원격 서비스 API 프록시 URL을 수정한 후 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'

    위의 예시는 connection failure으로 인해 Envoy가 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)이 있는지 확인합니다. 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. Apigee Edge UI를 사용하여 remote-service API 프록시에서 트레이스 세션을 시작합니다. 이 문제를 재현하고 추적 세션 XML 파일을 공유합니다.

    참조: Trace 도구 사용 | 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 명령어(curl 명령어의 전체 출력)를 사용하여 Envoy 프록시에 전송된 API 요청:
    curl -v ENVOY_PROXY_ENDPOINT
  7. curl 명령어 (curl 명령어의 전체 출력)를 사용하여 대상 서비스에 전송된 API 요청입니다.
    curl -v TARGET_SERVICE_ENDPOINT