Serwer proxy Envoy nie działa z powodu błędu HTTP 403 „Dostęp zabroniony” w adapterze Apigee dla Envoy

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Krótki opis problemu

Wywołanie Apigee Adapter for Envoy powoduje błąd HTTP 403 Forbidden w usłudze Envoy Proxy.

Komunikat o błędzie

Wyświetla się ten komunikat o błędzie:

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

Możliwe przyczyny

Serwer proxy Envoy zgłosi błąd HTTP 403, jeśli wystąpi jeden z tych warunków:

Przyczyna Opis Instrukcje rozwiązywania problemów dotyczące
Usługa API nie jest włączona Produkt interfejsu API nie jest włączony w określonym środowisku. Użytkownicy publicznej i prywatnej chmury Edge
Brak ścieżki URI usługi docelowej w produkcie API Ścieżka URI usługi docelowej nie została dodana do produktu interfejsu API w sekcji Zasoby interfejsu API. Użytkownicy publicznej i prywatnej chmury Edge
Brak nazwy hosta w produkcie API Nazwa hosta podana w żądaniu do interfejsu API klienta nie występuje w produkcie interfejsu API w sekcji zdalnych miejsc docelowych usługi Apigee. Użytkownicy publicznej i prywatnej chmury Edge
Brak klucza interfejsu API w nagłówku żądania Klucz interfejsu API nie jest przekazywany w nagłówku HTTP x-api-key. Użytkownicy publicznej i prywatnej chmury Edge
Nieprawidłowy klucz interfejsu API Klucz interfejsu API przekazany w ramach żądania jest nieprawidłowy. Użytkownicy publicznej i prywatnej chmury Edge
Apigee Adapter for Envoy nie może komunikować się z proxy interfejsu API usługi zdalnej Apigee Adapter for Envoy nie może komunikować się z serwerem proxy interfejsu API usługi zdalnej. Użytkownicy publicznej i prywatnej chmury Edge
Serwer proxy Envoy nie może komunikować się z Apigee Adapter for Envoy Serwer proxy Envoy nie może komunikować się z Apigee Adapter for Envoy Użytkownicy publicznej i prywatnej chmury Edge

Zanim zaczniesz

  1. Sprawdź, czy otrzymujesz wiadomość z odpowiedzią 403 Forbidden z serwera proxy Envoy. Na przykład:
    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. Włącz dzienniki debugowania:

    Sprawdź, czy w Apigee Adapter for Envoy włączono logi debugowania, aby rejestrować więcej informacji o błędzie. Jeśli nie, zatrzymaj i ponownie uruchom Apigee Adapter for Envoy, włączając dzienniki debugowania za pomocą tego polecenia:

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

Przyczyna: usługa API nie jest włączona

Ten błąd wystąpi, jeśli konkretny produkt API używany przez serwer proxy Envoy nie jest włączony w środowisku, w którym wywoływane są interfejsy API.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że w sekcji Authorizing request wyświetla się ten komunikat:
    product: API_PRODUCT_NAME not found

    Przykładowe dane wyjściowe dziennika debugowania:

    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

    Powyższy przykład pokazuje, że produktu API ENVOY-PRODUCT-1 nie znaleziono w adapterze Apigee dla Envoy.

    Więcej informacji o rejestrowaniu w Apigee Adapter for Envoy znajdziesz w sekcji Rejestrowanie.

  3. Jeśli podczas autoryzacji żądania do interfejsu API zobaczysz ten komunikat, najprawdopodobniej oznacza to, że konkretna usługa API nie jest włączona w środowisku, w którym wykonujesz wywołania interfejsu API.
  4. Aby to sprawdzić, wykonaj te czynności:
    1. Zaloguj się w interfejsie Edge.
    2. Na stronie Publikowanie > Produkty interfejsu API kliknij konkretny produkt interfejsu API, którego używasz do konfigurowania Apigee Adapter for Envoy.
    3. Sprawdź, czy konkretne środowisko, w którym wysyłasz żądania do interfejsu API, jest włączone w usłudze API.
    4. Jeśli konkretne środowisko nie jest włączone w produkcie API, to jest to przyczyną tego problemu.
  5. Jeśli określone środowisko jest już włączone, przejdź do sekcji Przyczyna: brak ścieżki identyfikatora URI usługi docelowej w produkcie API.

Rozdzielczość

Jeśli określone środowisko nie jest włączone w produkcie API, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Produkty interfejsu API kliknij konkretny produkt interfejsu API, którego używasz do konfigurowania Apigee Adapter for Envoy.
  3. Na stronie Produkty API > Nazwa produktu kliknij Edytuj.
  4. Włącz konkretne środowisko, w którym chcesz wysyłać żądania do interfejsu API, zaznaczając pole wyboru odpowiedniego środowiska.
  5. Kliknij Zapisz.

Przyczyna: brak ścieżki identyfikatora URI usługi docelowej w usłudze API

Ten błąd wystąpi, jeśli ścieżka URI miejsca docelowego nie jest określona w konkretnym produkcie API używanym przez serwer proxy Envoy.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź dzienniki Apigee Adapter for Envoy i upewnij się, że w sekcji Authorizing request wyświetla się ten komunikat dotyczący konkretnej usługi API powiązanej z określonym miejscem docelowym:

    no path: REQUEST_URI_PATH

    Przykładowe dane wyjściowe dziennika debugowania:

    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)

    Przykładowe dane wyjściowe pokazują komunikat:

    no path: /echo1

    Oznacza to, że ścieżki /echo1 nie znaleziono w usłudze API ENVOY-PRODUCT-1.

  3. Jeśli w dziennikach debugowania adaptera Apigee dla Envoy zobaczysz komunikat no path: REQUEST_URI_PATH, oznacza to, że jest to przyczyna problemu. Jeśli tak nie jest, przejdź do sekcji Przyczyna: brak nazwy hosta w produkcie API.

Rozdzielczość

Jeśli konkretny identyfikator URI żądania nie został dodany do produktu API dla konkretnego miejsca docelowego, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Produkty interfejsu API kliknij konkretny produkt interfejsu API, którego używasz do konfigurowania Apigee Adapter for Envoy.
  3. Na stronie Produkty API > Nazwa produktu kliknij Edytuj.
  4. W panelu Zasoby interfejsu API dodaj do produktu API identyfikator URI żądania do interfejsu API.
  5. Monitoruj logi Apigee Adapter for Envoy i poczekaj, aż pobierze on zaktualizowaną usługę API. Następnie wyślij kolejne żądanie do interfejsu API, aby sprawdzić, czy problem został rozwiązany.

Przyczyna: brak nazwy hosta w usłudze API

Ten błąd wystąpi, jeśli docelowa kombinacja nazwy hosta i portu nie zostanie dodana do konkretnego produktu API używanego przez serwer proxy Envoy.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że w sekcji Authorizing request wyświetla się ten komunikat dotyczący konkretnej usługi API powiązanej z określonym miejscem docelowym:

    no targets: HOSTNAME:PORT

    Przykładowe dane wyjściowe dziennika debugowania:

    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)

    Z powyższego przykładu wynika, że kombinacja nazwy hosta i portu httpbin1:8080 nie została znaleziona w produkcie API ENVOY-PRODUCT-1.

  3. Jeśli w logach Apigee Adapter for Envoy znajduje się wpis z komunikatem no targets: HOSTNAME:PORT podczas autoryzacji żądania, jest to przyczyna problemu. Jeśli nie, przejdź do sekcji Przyczyna: brak klucza interfejsu API w nagłówku żądania.

Rozdzielczość

Jeśli docelowa nazwa hosta i port nie zostały dodane do produktu API, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Produkty interfejsu API kliknij konkretny produkt interfejsu API, którego używasz do konfigurowania Apigee Adapter for Envoy.
  3. Na stronie Produkty API > Nazwa produktu kliknij Edytuj.
  4. W panelu Apigee remote service targets (Cele zdalnej usługi Apigee) dodaj nazwę hosta i port docelowy, a następnie kliknij Save (Zapisz).

    Jeśli w interfejsie nie widzisz sekcji Apigee remote service targets, dodaj do produktu API atrybut niestandardowy o nazwie apigee-remote-service-targets i wartości HOSTNAME:PORT za pomocą interfejsu Edge API. Na przykład:

    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. Po wykonaniu powyższego zadania monitoruj logi Apigee Adapter for Envoy i poczekaj, aż Apigee Adapter for Envoy pobierze zaktualizowany produkt API. Następnie wyślij kolejne żądanie interfejsu API, aby sprawdzić, czy problem został rozwiązany.

Przyczyna: w nagłówku żądania brakuje klucza interfejsu API

Ten błąd występuje, jeśli klucz interfejsu API nie jest przekazywany w nagłówkach żądania.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że w sekcji Authenticate error widzisz komunikat [missing authentication].

    Przykładowe dane wyjściowe dziennika debugowania:

    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

    Przykładowe dane wyjściowe powyżej zawierają komunikat [missing authentication]. Ten komunikat oznacza, że klucz interfejsu API nie jest przekazywany w nagłówku żądania.

  3. Jeśli w logach Apigee Adapter for Envoy znajduje się wpis logu z komunikatem [missing authentication]w sekcji Authenticate error , to jest to przyczyna problemu. Jeśli nie, przejdź do sekcji Przyczyna: nieprawidłowy klucz interfejsu API.

Rozdzielczość

Jeśli w dziennikach Apigee Adapter for Envoy pojawił się błąd [missing authentication], wykonaj te czynności, aby rozwiązać problem:

  1. Sprawdź, czy klient wysłał klucz interfejsu API za pomocą nagłówka HTTP x-api-key w żądaniu do interfejsu API. Jeśli nie, poproś klienta o przesłanie klucza interfejsu API w nagłówku HTTP x-api-key.
  2. Sprawdź plik konfiguracji Apigee Adapter for Envoy i upewnij się, że domyślna nazwa nagłówka klucza interfejsu API x-api-key została zmieniona, np.:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        global:
          tls:
            ...
        tenant:
          ...
        auth:
          target_header: api-key

    W powyższym przykładzie domyślna nazwa nagłówka klucza interfejsu API została zmieniona na api-key. W tym przypadku musisz przekazać klucz interfejsu API w ramach nagłówka api-key.

  3. Jeśli domyślna nazwa nagłówka klucza interfejsu API została zmieniona, poproś klienta o użycie zaktualizowanej nazwy nagłówka klucza interfejsu API i wysłanie kolejnego żądania do interfejsu API. Sprawdź, czy to rozwiąże problem.

Przyczyna: nieprawidłowy klucz interfejsu API

Ten błąd wystąpi, jeśli w nagłówku żądania zostanie przekazany nieprawidłowy klucz interfejsu API.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że w sekcji Authenticate error widzisz komunikat [permission denied] . Zwykle jest to wyświetlane po pobraniu klucza interfejsu API przez adapter, co jest sygnalizowane komunikatem fetchToken fetching: API_KEY.

    Przykładowe dane wyjściowe dziennika debugowania:

    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)

    W tym przykładzie klucz interfejsu API wysłany w żądaniu do interfejsu API był nieprawidłowy.

  3. Jeśli logi Apigee Adapter for Envoy zawierają wpis logu z [permission denied] w sekcji Authenticate error , oznacza to, że klucz interfejsu API przekazany w ramach żądania jest nieprawidłowy i jest przyczyną problemu. Jeśli nie, przejdź do sekcji Przyczyna: adapter Apigee dla Envoy nie może się komunikować z serwerem proxy interfejsu API usługi zdalnej.

Rozdzielczość

Jeśli w sekcji Authenticate error w dziennikach Apigee Adapter for Envoy pojawi się komunikat [permission denied], wykonaj te czynności, aby rozwiązać problem:

  1. Sprawdź, czy klucz interfejsu API wysłany w żądaniu do interfejsu API jest zgodny z wartością klucza interfejsu API w aplikacji połączonej z usługą API.
  2. Jeśli klucz interfejsu API używany przez klienta jest nieprawidłowy, poproś klienta o przesłanie prawidłowego klucza interfejsu API.
  3. Jeśli klucz interfejsu API używany przez klienta jest prawidłowy, a błąd HTTP 403 nadal występuje, skontaktuj się z zespołem pomocy Apigee Edge, aby uzyskać dalsze informacje.

Przyczyna: Apigee Adapter for Envoy nie może się komunikować z serwerem proxy interfejsu API usługi zdalnej.

Ten błąd wystąpi, jeśli adapter Apigee dla Envoy nie może komunikować się z serwerem proxy interfejsu API usługi zdalnej, ponieważ skonfigurowany host usługi zdalnej jest nieprawidłowy.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z instrukcjami podanymi powyżej w kroku 2.
  2. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że widzisz ten komunikat:

    Error retrieving products: REQUEST_URI: no such host

    Przykładowe dane wyjściowe dziennika debugowania:

    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

    W tym przykładzie adapter Apigee dla Envoy nie mógł się komunikować z serwerem proxy interfejsu API remote-service, ponieważ nazwa hosta podana w adresie URL serwera proxy interfejsu API serwera zdalnego jest nieprawidłowa, co wskazuje błąd no such host .

  3. Jeśli dzienniki Apigee Adapter for Envoy zawierają wpis logu z komunikatem no such host, to jest to przyczyna problemu. Jeśli nie, przejdź do sekcji Przyczyna: serwer proxy Envoy nie może komunikować się z Apigee Adapter for Envoy.

Rozdzielczość

Jeśli w logach Apigee Adapter for Envoy wyświetlają się powyższe błędy, wykonaj te czynności, aby rozwiązać problem:

  1. Sprawdź plik konfiguracyjny Apigee Adapter for Envoy i upewnij się, że podany adres URL zdalnego proxy interfejsu API jest prawidłowy.

    Jeśli nie, zatrzymaj Apigee Adapter for Envoy, popraw adres URL serwera proxy interfejsu API usługi zdalnej w pliku konfiguracji, uruchom Apigee Adapter for Envoy i wyślij kolejne żądanie do interfejsu API, a następnie sprawdź, czy problem został rozwiązany.

    Przykładowa konfiguracja:

    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. Sprawdź, czy serwer proxy interfejsu API remote-service jest wdrożony w odpowiednim środowisku Edge. Jeśli nie, wdróż remote-service serwer proxy interfejsu API w odpowiednim środowisku Edge i spróbuj jeszcze raz.
  3. Sprawdź połączenie sieciowe między Apigee Adapter for Envoy a punktem końcowym proxy interfejsu API remote-service. Jeśli wystąpią problemy z połączeniem sieciowym, skontaktuj się z zespołem ds. sieci i spróbuj rozwiązać problem.

Przyczyna: serwer proxy Envoy nie może się komunikować z Apigee Adapter for Envoy

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Sprawdź, czy w Envoy masz włączone dzienniki debugowania. Jeśli nie, zatrzymaj Envoy i uruchom go ponownie, włączając dzienniki debugowania. Następnie wyślij kolejne żądanie do interfejsu API.

    Wdrożenia samodzielne:

    envoy -c envoy-config.yaml -l debug

    Wdrożenia oparte na 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. Sprawdź logi Apigee Adapter for Envoy i upewnij się, że znajduje się w nich wpis logu z tym komunikatem:
    connecting to APIGEE_ENVOY_ADAPTER_HOST:5000

    Następnie:

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

    Przykładowe dane wyjściowe dziennika debugowania:

    [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'

    Powyższy przykład pokazuje, że Envoy nie mógł się komunikować z Apigee Adapter for Envoy z powodu connection failure.

  3. connection failure może wynikać z różnych przyczyn. Przyjrzyjmy się każdemu z tych scenariuszy.

Scenariusz 1. Proces adaptera nie jest uruchomiony

Ten błąd może wystąpić, jeśli proces Apigee Adapter for Envoy nie jest uruchomiony.

  1. Sprawdź, czy proces Apigee Adapter for Envoy działa, wykonując to polecenie: Jeśli proces Apigee Adapter for Envoy jest uruchomiony, wynik tego polecenia powinien go zawierać.
    ps -ef | grep apigee-remote-service-envoy
  2. Jeśli nie działa, to jest przyczyną problemu.

Rozdzielczość

  1. Jeśli proces Apigee Adapter for Envoy nie jest uruchomiony, uruchom go.
  2. Wyślij kolejne żądanie do interfejsu API i sprawdź, czy problem został rozwiązany.

Scenariusz 2. Proces adaptera nie nasłuchuje na określonym porcie

Ten błąd może wystąpić, jeśli proces Apigee Adapter for Envoy nie nasłuchuje na określonym porcie.

Jeśli proces Apigee Adapter for Envoy jest uruchomiony, sprawdź, czy gniazdo nasłuchuje na porcie 5000: APIGEE_ENVOY_ADAPTER_HOST:5000. Aby to sprawdzić, możesz uruchomić polecenie netstat:

sudo netstat -lnp | grep 5000

Przykładowe dane wyjściowe:

sudo netstat -lnp | grep 5000

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

Jeśli na porcie 5000 nie ma gniazda nasłuchującego, może to być przyczyną problemu.

Rozdzielczość

  1. Zatrzymaj i ponownie uruchom Apigee Adapter for Envoy.
  2. Wyślij kolejne żądanie do interfejsu API i sprawdź, czy problem został rozwiązany.

Scenariusz 3. Połączenie sieciowe między Envoy a Apigee Adapter for Envoy

  1. Sprawdź połączenie sieciowe między Envoy a Apigee Adapter for Envoy:
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    Jeśli telnet może nawiązać połączenie TCP z adapterem Apigee dla Envoy, wyświetlą się dane wyjściowe podobne do tych poniżej:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
  2. Jeśli podczas korzystania z telnetu zobaczysz błąd Connection timed out, oznacza to, że występuje problem z połączeniem sieciowym między Envoy a Apigee Adapter for Envoy.

Rozdzielczość

Jeśli zauważysz problemy z połączeniem sieciowym między Envoy a Apigee Adapter for Envoy, skontaktuj się z zespołem ds. sieci i spróbuj rozwiązać problem.

Jeśli problem nadal występuje, przejdź do sekcji Informacje diagnostyczne, które musisz zebrać.

musi zbierać informacje diagnostyczne;

Jeśli po wykonaniu powyższych instrukcji problem nadal występuje, zbierz te informacje diagnostyczne i skontaktuj się z zespołem pomocy Apigee Edge:

  1. Używana usługa Apigee:

    Przykład: Apigee Edge Cloud, Apigee OPDK, Apigee hybrid, Apigee X

  2. Organizacja i środowisko Apigee
  3. Definicja usługi API odczytana za pomocą interfejsu Edge API:

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

    Odwołanie: interfejsy API Apigee Edge

  4. Rozpocznij sesję śledzenia w remote-service serwerze proxy interfejsu API za pomocą interfejsu Apigee Edge. Odtwórz ten problem i udostępnij plik XML sesji śledzenia.

    Więcej informacji: Korzystanie z narzędzia Trace | Apigee Edge

  5. Dzienniki Apigee Adapter for Envoy (pełne dzienniki związane z danym okresem)

    Wdrożenia samodzielne:

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

    Wdrożenia oparte na Kubernetes/Istio:

    kubectl -n=apigee get pods
    kubectl -n=apigee logs APIGEE_REMOTE_SERVICE_ENVOY_POD_NAME > apigee-remote-service-envoy.log
  6. Żądanie do interfejsu API wysłane do proxy Envoy za pomocą polecenia curl (pełne dane wyjściowe polecenia curl):
    curl -v ENVOY_PROXY_ENDPOINT
  7. Żądanie do interfejsu API wysłane do usługi docelowej za pomocą polecenia curl (pełne dane wyjściowe polecenia curl):
    curl -v TARGET_SERVICE_ENDPOINT