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

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Krótki opis problemu

Po wywołaniu adaptera Apigee dla Envoy serwer proxy Envoy kończy się niepowodzeniem i wyświetlany jest błąd HTTP 403 Forbidden.

Komunikat o błędzie

Wyświetlany jest 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 Usługa API nie jest włączona w tym środowisku. Użytkownicy chmury publicznej i prywatnej usługi Edge
Brak ścieżki identyfikatora URI usługi docelowej w usłudze API Brakuje ścieżki URI usługi docelowej lub nie została ona dodana do usługi API w zasobach interfejsu API. Użytkownicy chmury publicznej i prywatnej usługi Edge
Brak nazwy hosta w usłudze API W usłudze API w zdalnych celach Apigee brakuje nazwy hosta podanej w żądaniu do interfejsu API klienta. Użytkownicy chmury publicznej i prywatnej usługi Edge
Brak klucza interfejsu API w nagłówku żądania Klucz interfejsu API nie jest przekazywany w nagłówku HTTP x-api-key. Użytkownicy chmury publicznej i prywatnej usługi Edge
Nieprawidłowy klucz interfejsu API Klucz interfejsu API przekazany w żądaniu jest nieprawidłowy. Użytkownicy chmury publicznej i prywatnej usługi Edge
Adapter Apigee dla Envoy nie może komunikować się z serwerem proxy interfejsu API usługi zdalnej Adapter Apigee dla Envoy nie może komunikować się z serwerem proxy API usługi zdalnej. Użytkownicy chmury publicznej i prywatnej usługi Edge
Serwer proxy Envoy nie może komunikować się z adapterem Apigee dla Envoy Serwer proxy Envoy nie może komunikować się z adapterem Apigee dla Envoy Użytkownicy chmury publicznej i prywatnej usługi Edge

Zanim zaczniesz

  1. Sprawdź, czy otrzymujesz wiadomość z odpowiedzią 403 Forbidden z serwera proxy Envoy. 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 adapterze Apigee dla Envoy są włączone logi debugowania, aby zarejestrować więcej informacji o błędzie. Jeśli nie, zatrzymaj kartę Apigee Adapter dla Envoy i uruchom ją ponownie, włączając logi 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ępuje, jeśli określona usługa API używana przez Envoy Proxy nie jest włączona w konkretnym środowisku, w którym są wywoływane wywołania interfejsu API.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z opisem w kroku 2 powyżej.
  2. Sprawdź Adapter Apigee pod kątem logów 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 w pakiecie Apigee Adapter dla Envoy nie znaleziono usługi API ENVOY-PRODUCT-1.

    Więcej informacji o adapterze Apigee do logowania w Envoy znajdziesz w artykule o logowaniu.

  3. Jeśli widzisz ten komunikat podczas autoryzacji żądania do interfejsu API, najprawdopodobniej oznacza to, że dana usługa API nie jest włączona w konkretnym ś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 > Usługi API kliknij konkretną usługę API, która została użyta do skonfigurowania adaptera Apigee dla Envoy.
    3. Sprawdź, czy w usłudze API jest włączone konkretne środowisko, w którym wysyłasz żądania do interfejsu API.
    4. Jeśli dane środowisko nie jest włączone w usłudze API, to jest przyczyną problemu.
  5. Jeśli dane środowisko jest już włączone, przejdź do sekcji Przyczyna: brak docelowej ścieżki URI usługi w usłudze API.

Rozdzielczość

Jeśli dane środowisko nie jest włączone w usłudze API, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Usługi API kliknij konkretną usługę API, która została użyta do skonfigurowania adaptera Apigee dla Envoy.
  3. Na stronie Usługi interfejsu 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 produkcie API

Ten błąd występuje, jeśli ścieżka URI obiektu docelowego nie została określona w konkretnej usłudze API używanej przez serwer Envoy Proxy.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z opisem w kroku 2 powyżej.
  2. Sprawdź Adapter Apigee dla logów Envoy i upewnij się, że ten komunikat jest wyświetlany w przypadku konkretnej usługi API powiązanej z miejscem docelowym w sekcji Authorizing request:

    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 zawierają komunikat:

    no path: /echo1
    

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

  3. Jeśli widzisz komunikat no path: REQUEST_URI_PATH w dziennikach debugowania Apigee Adapter dla Envoy, to jest przyczyną problemu. Jeśli nie, przejdź do artykułu Przyczyna: brak nazwy hosta w usłudze API.

Rozdzielczość

Jeśli określony identyfikator URI żądania nie został dodany do usługi API dla określonego miejsca docelowego, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Usługi API kliknij konkretną usługę API, która została użyta do skonfigurowania adaptera Apigee dla Envoy.
  3. Na stronie Usługi interfejsu API > Nazwa produktu kliknij Edytuj.
  4. W panelu Zasoby interfejsu API dodaj do usługi API identyfikator URI żądania interfejsu API.
  5. Monitoruj Adapter Apigee pod kątem logów Envoy i poczekaj, aż Adapter Apigee dla Envoy pobierze 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 produkcie API

Ten błąd występuje, jeśli docelowa kombinacja nazwy hosta i portu nie została dodana do konkretnej usługi API używanej przez Envoy Proxy.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z opisem w kroku 2 powyżej.
  2. Sprawdź Adapter Apigee dla logów Envoy i upewnij się, że ten komunikat jest wyświetlany w przypadku konkretnej usługi API powiązanej z miejscem docelowym w sekcji Authorizing request:

    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)

    Powyższy przykład pokazuje, że w usłudze API ENVOY-PRODUCT-1 nie znaleziono kombinacji nazwy hosta i portu httpbin1:8080.

  3. Jeśli podczas autoryzacji żądania Adapter Apigee dla logów Envoy zawiera wpis z komunikatem no targets: HOSTNAME:PORT, to jest przyczyną problemu. Jeśli nie, przejdź do artykułu Przyczyna: brak klucza interfejsu API w nagłówku żądania.

Rozdzielczość

Jeśli kombinacja docelowej nazwy hosta i portu nie została dodana do usługi API, wykonaj te czynności, aby rozwiązać problem:

  1. Zaloguj się w interfejsie Edge.
  2. Na stronie Publikowanie > Usługi API kliknij konkretną usługę API, która została użyta do skonfigurowania adaptera Apigee dla Envoy.
  3. Na stronie Usługi interfejsu API > Nazwa produktu kliknij Edytuj.
  4. W panelu Zdalne cele usługi Apigee dodaj nazwę hosta docelowego i port, a następnie kliknij Zapisz.

    Jeśli nie widzisz sekcji Zdalne cele usługi Apigee, dodaj atrybut niestandardowy do usługi API o nazwie apigee-remote-service-targets i dodaj wartość 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 tego zadania obserwuj Adapter Apigee pod kątem logów Envoy i poczekaj, aż Adapter Apigee dla Envoy pobierze zaktualizowaną usługę API. Następnie wyślij kolejne żądanie do interfejsu API, aby sprawdzić, czy problem został rozwiązany.

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

Ten błąd występuje, jeśli klucz interfejsu API nie zostanie przekazany w nagłówkach żądań.

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z opisem w kroku 2 powyżej.
  2. Sprawdź Adapter Apigee pod kątem logów Envoy i zobacz, czy w sekcji Authenticate error wyświetlany jest 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 pokazane powyżej zawierają komunikat [missing authentication]. Ten komunikat oznacza, że klucz interfejsu API nie jest przekazywany jako część nagłówka żądania.

  3. Jeśli Adapter Apigee do logów Envoy zawiera wpis logu z komunikatem [missing authentication] w sekcji Authenticate error , to jest przyczyną problemu. Jeśli nie, zapoznaj się z artykułem Przyczyna: nieprawidłowy klucz interfejsu API.

Rozdzielczość

Jeśli błąd [missing authentication] był wyświetlany w logach Apigee Adapter dla Envoy, wykonaj te czynności, aby rozwiązać problem:

  1. Sprawdź, czy klient wysłał klucz interfejsu API, używając nagłówka HTTP x-api-key w żądaniu do interfejsu API. Jeśli nie, poproś klienta o wysłanie klucza interfejsu API w nagłówku HTTP x-api-key.
  2. Sprawdź Adapter Apigee dla pliku konfiguracji Envoy i upewnij się, że domyślna nazwa nagłówka klucza interfejsu API x-api-key została zmieniona, na przykład:
    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 nagłówku api-key.

  3. Jeśli domyślna nazwa nagłówka klucza interfejsu API uległa zmianie, poproś klienta o użycie zaktualizowanej nazwy nagłówka klucza interfejsu API, wyślij kolejne żądanie do interfejsu API i sprawdź, czy to rozwiązało problem.

Przyczyna: nieprawidłowy klucz interfejsu API

Ten błąd występuje, 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 opisem w kroku 2 powyżej.
  2. Sprawdź Adapter Apigee pod kątem logów Envoy i zobacz, czy w sekcji Authenticate error wyświetlany jest komunikat [permission denied] . Zwykle jest wyświetlana po pobraniu klucza interfejsu API przez adapter, co jest oznaczone 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 Adapter Apigee dla logów Envoy zawiera 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 artykułu Przyczyna: Adapter Apigee dla Envoy nie może komunikować się z serwerem proxy interfejsu API usługi zdalnej.

Rozdzielczość

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

  1. Sprawdź klucz interfejsu API wysłany w żądaniu do interfejsu API pod kątem wartości klucza interfejsu API znalezionej w aplikacji połączonej z usługą API.
  2. Jeśli klucz interfejsu API używany przez klienta jest nieprawidłowy, poproś klienta o wysłanie prawidłowego klucza interfejsu API.
  3. Jeśli klucz interfejsu API używany przez klienta jest prawidłowy i nadal występuje błąd HTTP 403, skontaktuj się z zespołem pomocy Apigee Edge, aby dokładniej zbadać problem.

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

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

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Włącz dzienniki debugowania zgodnie z opisem w kroku 2 powyżej.
  2. Sprawdź dzienniki Envoy w adapterze Apigee 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ł połączyć się z serwerem proxy interfejsu API usługi zdalnej, 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 Adapter Apigee do dzienników Envoy zawiera wpis logu z komunikatem no such host, to jest przyczyną problemu. Jeśli nie, przejdź do artykułu Przyczyna: serwer proxy Envoy nie może komunikować się z adapterem Apigee dla Envoy.

Rozdzielczość

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

  1. Sprawdź adapter Apigee dla pliku konfiguracji Envoy i upewnij się, że podany adres URL serwera proxy interfejsu API usługi zdalnej jest prawidłowy.

    Jeśli nie, zatrzymaj Apigee Adapter dla Envoy, popraw adres URL serwera proxy interfejsu API usługi zdalnej w pliku konfiguracji, uruchom Adapter Apigee dla Envoy, wyślij kolejne żądanie do interfejsu API i sprawdź poprawkę.

    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 remote-service API jest wdrożony w odpowiednim środowisku Edge. Jeśli nie, wdróż serwer proxy interfejsu remote-service API w odpowiednim środowisku brzegowym i spróbuj ponownie.
  3. Sprawdź połączenie sieciowe między adapterem Apigee dla Envoy a punktem końcowym serwera proxy interfejsu API remote-service. Jeśli zostały wykryte problemy z połączeniem sieciowym, skontaktuj się z zespołem ds. sieci i spróbuj je rozwiązać.

Przyczyna: serwer proxy Envoy nie może komunikować się z adapterem Apigee dla Envoy

Diagnostyka

Aby zdiagnozować problem, wykonaj te czynności:

  1. Sprawdź, czy w Envoy są włączone dzienniki debugowania. Jeśli nie, zatrzymaj aplikację Envoy i uruchom ją ponownie, włączając logi 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ź łącznik Apigee pod kątem logów Envoy i upewnij się, że znajduje się w nim wpis z komunikatem:
    connecting to APIGEE_ENVOY_ADAPTER_HOST:5000
    

    po którym następuje:

    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 usługa Envoy nie mogła połączyć się z adapterem Apigee w Envoy z powodu connection failure.

  3. connection failure może mieć różne przyczyny. Przeanalizujmy każdy z tych scenariuszy.

Scenariusz 1: proces adaptera nie działa

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

  1. Sprawdź, czy proces Apigee Adapter dla Envoy jest uruchomiony, wykonując poniższe polecenie. Jeśli proces Apigee Adapter dla Envoy jest uruchomiony, powinien zostać wyświetlony wynik tego polecenia.
    ps -ef | grep apigee-remote-service-envoy
    
  2. Jeśli tak, to właśnie jest przyczyną problemu.

Rozdzielczość

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

Scenariusz nr 2: proces adaptera nie nasłuchuje na konkretnym porcie

Ten błąd może wystąpić, jeśli proces Adaptera Apigee dla Envoy nie nasłuchuje na konkretnym porcie.

Jeśli proces Adaptera Apigee dla Envoy jest uruchomiony, sprawdź, czy na porcie 5000 znajduje się gniazdo nasłuchujące: APIGEE_ENVOY_ADAPTER_HOST:5000. Aby to sprawdzić, możesz uruchomić polecenie netstat:

sudo netstat -lnp | grep 5000

Przykładowe wyniki:

sudo netstat -lnp | grep 5000

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

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

Rozdzielczość

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

Scenariusz nr 3: połączenie sieciowe między Envoy a adapterem Apigee dla Envoy

  1. Sprawdź połączenie sieciowe między Envoy a adapterem Apigee dla 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, zostaną wyświetlone dane wyjściowe podobne do tych:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    
  2. Jeśli zauważysz błąd Connection timed out w Telnet, oznacza to, że istnieje problem z połączeniem sieciowym między Envoy a adapterem Apigee w Envoy.

Rozdzielczość

Jeśli zauważysz problemy z połączeniem sieciowym między Envoy a Apigee Adapter dla Envoy, zaangażuj swój zespół ds. sieci i spróbuj rozwiązać ten problem.

Jeśli problem nadal występuje, przejdź do artykułu Wymagane jest zebranie informacji diagnostycznych.

Musisz zebrać informacje diagnostyczne

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

  1. Użyta usługa Apigee:

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

  2. Organizacja i środowisko Apigee
  3. Odczyt definicji usługi API przy użyciu interfejsu Edge API:

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

    Dokumentacja: interfejsy API Apigee Edge

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

    Dokumentacja: Korzystanie z narzędzia Trace | Apigee Edge

  5. Adapter Apigee do dzienników Envoy (pełne logi 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 serwera 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