Apigee Adapter for Envoy 發生 HTTP 403 禁止錯誤錯誤

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

問題

透過 Apigee Adapter for Envoy 叫用 Envoy Proxy 會失敗,並顯示 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 Proxy 會引發 HTTP 403 錯誤:

原因 說明 適用的疑難排解指示
未啟用 API 產品 特定環境未啟用 API 產品。 Edge Public and Private Cloud 使用者
API 產品中缺少目標服務 URI 路徑 API 資源下的 API 產品缺少目標服務的 URI 路徑,或是該路徑未新增至 API 產品。 Edge Public and Private Cloud 使用者
API 產品缺少主機名稱 在 Apigee 遠端服務目標下的 API 產品中,缺少用戶端 API 要求提供的主機名稱。 Edge Public and Private Cloud 使用者
要求標頭中缺少 API 金鑰 API 金鑰不會傳入 x-api-key HTTP 標頭。 Edge Public and Private Cloud 使用者
API 金鑰無效 要求中傳送的 API 金鑰無效。 Edge Public and Private Cloud 使用者
Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊 Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊。 Edge Public and Private Cloud 使用者
Envoy Proxy 無法與 Apigee Adapter for Envoy 通訊 Envoy Proxy 無法與 Apigee Adapter for Envoy 通訊 Edge Public and Private Cloud 使用者

事前準備

  1. 確認您收到來自 Envoy Proxy 的 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. 啟用偵錯記錄:

    請確保您已在 Apigee Adapter for Envoy 中啟用偵錯記錄檔,以擷取更多關於錯誤的詳細資料。如果問題仍未解決,請停止 Apigee Adapter for Envoy 再重新啟動,並使用下列指令啟用偵錯記錄檔:

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

原因:未啟用 API 產品

如果在叫用 API 呼叫的特定環境未啟用 Envoy Proxy 使用的特定 API 產品,就會發生這個錯誤。

診斷

請按照下列步驟診斷問題:

  1. 按照上方步驟 2 的說明啟用偵錯記錄。
  2. 查看 Apigee Adapter for Envoy 記錄檔,確認 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
    

    以上範例顯示在 Apigee Adapter for Envoy 中找不到 API 產品 ENVOY-PRODUCT-1

    如要進一步瞭解 Apigee Adapter for Envoy 記錄功能,請參閱 Logging

  3. 如果您在授權 API 要求時看到這則訊息,很有可能表示您在進行 API 呼叫的環境中並未啟用特定 API 產品。
  4. 請按照下列步驟確認是否發生上述情況:
    1. 登入 Edge UI
    2. 在「發布」>「API 產品」頁面上,按一下用於設定 Apigee Adapter for Envoy 的特定 API 產品。
    3. 確認您提出 API 要求所在的特定環境已在 API 產品中啟用。
    4. 如果在 API 產品中未啟用特定環境,這就是這項問題的原因。
  5. 如果特定環境已啟用,請前往 原因:API 產品中缺少目標服務 URI 路徑

解析度

如果 API 產品未啟用特定環境,請按照下列步驟解決問題:

  1. 登入 Edge UI
  2. 在「發布」>「API 產品」頁面上,按一下用於設定 Apigee Adapter for Envoy 的特定 API 產品。
  3. 在「API 產品」>「產品名稱」頁面中,按一下「編輯」
  4. 啟用您要提出 API 要求的特定環境,方法是勾選相關的環境核取方塊。
  5. 點按「儲存」

原因:API 產品中缺少目標服務 URI 路徑

如果 Envoy Proxy 使用的特定 API 產品中未指定目標的 URI 路徑,就會發生這個錯誤。

診斷

請按照下列步驟診斷問題:

  1. 按照上方步驟 2 的說明啟用偵錯記錄。
  2. 查看 Apigee Adapter for Envoy 記錄檔,確認與 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. 如果您在 Apigee Adapter for Envoy 偵錯記錄檔中看見「no path: REQUEST_URI_PATH」訊息,就是這項問題的原因。如果沒有,請參閱原因:API 產品缺少主機名稱

解析度

如果未將特定要求 URI 新增至特定目標的 API 產品,請按照下列步驟解決問題:

  1. 登入 Edge UI
  2. 在「發布」>「API 產品」頁面上,按一下用於設定 Apigee Adapter for Envoy 的特定 API 產品。
  3. 在「API 產品」>「產品名稱」頁面中,按一下「編輯」
  4. 在「API 資源」窗格中,將 API 要求 URI 新增至 API 產品。
  5. 監控 Apigee Adapter for Envoy 記錄檔,並等待 Apigee Adapter for Envoy 擷取更新後的 API 產品。之後,請傳送另一個 API 要求來驗證修正結果。

原因:API 產品缺少主機名稱

如果 Envoy Proxy 使用的特定 API 產品未加入目標主機名稱和通訊埠組合,就會發生這個錯誤。

診斷

請按照下列步驟診斷問題:

  1. 按照上方步驟 2 的說明啟用偵錯記錄。
  2. 查看 Apigee Adapter for Envoy 記錄檔,確認與 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. 如果 Apigee Adapter for Envoy 記錄檔在授權要求時,含有包含 no targets: HOSTNAME:PORT 訊息的項目,這就是問題的原因。如果不支援,請參閱原因:要求標頭中缺少 API 金鑰

解析度

如果目標主機名稱和通訊埠組合未新增至 API 產品,請按照下列步驟解決問題:

  1. 登入 Edge UI
  2. 在「發布」>「API 產品」頁面上,按一下用於設定 Apigee Adapter for Envoy 的特定 API 產品。
  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": []
    }
    
  5. 完成上述工作後,請監控 Apigee Adapter for Envoy 記錄檔,並等待 Apigee Adapter for Envoy 擷取更新後的 API 產品。之後,請傳送另一個 API 要求來驗證修正結果。

原因:要求標頭中缺少 API 金鑰

如果沒有在要求標頭中傳送 API 金鑰,就會發生這個錯誤。

診斷

請按照下列步驟診斷問題:

  1. 按照上方步驟 2 的說明啟用偵錯記錄。
  2. 查看 Apigee Adapter for Envoy 記錄檔,確認您在 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. 如果 Apigee Adapter for Envoy 記錄包含 Authenticate error 區段下方有 [missing authentication] 訊息的記錄項目,這就是問題的原因。如果沒有,請參閱「原因:無效的 API 金鑰」。

解析度

如果 Apigee Adapter for Envoy 記錄檔中顯示了 [missing authentication] 錯誤,請按照下列步驟解決問題:

  1. 檢查用戶端是否已在 API 要求中使用 HTTP 標頭 x-api-key 傳送 API 金鑰。如果沒有,請要求用戶端透過 HTTP 標頭 x-api-key 傳送 API 金鑰。
  2. 檢查 Apigee Adapter for Envoy 設定檔,確認預設的 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. 查看 Apigee Adapter for Envoy 記錄檔,確認您已在 Authenticate error 區段底下看見 [permission denied] 訊息。通常在擷取器擷取 API 金鑰後 (如訊息 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. 如果 Apigee Adapter for Envoy 記錄包含 Authenticate error 區段下方含有 [permission denied] 的記錄項目,表示在要求中傳遞的 API 金鑰無效,因此造成問題。如果不允許,請參閱「原因:Envoy 的 Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊」。

解析度

如果 Apigee Adapter for Envoy 記錄檔的 Authenticate error 區段下方顯示了 [permission denied] 訊息,請按照下列步驟解決問題:

  1. 根據連結至 API 產品的應用程式中顯示的 API 金鑰值,檢查 API 要求中傳送的 API 金鑰。
  2. 如果用戶端使用的 API 金鑰無效,請要求用戶端傳送有效的 API 金鑰。
  3. 如果用戶端使用的 API 金鑰有效,且您仍看到 HTTP 403 錯誤,請聯絡 Apigee Edge 支援團隊進一步調查這個問題。

原因:Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊

如果遠端服務主機設定的遠端服務主機無效,當 Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊,就會發生這個錯誤。

診斷

請按照下列步驟診斷問題:

  1. 按照上方步驟 2 的說明啟用偵錯記錄。
  2. 查看 Apigee Adapter for Envoy 記錄檔,確認是否顯示下列訊息:

    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
    

    在此範例中,Apigee Adapter for Envoy 無法與遠端服務 API Proxy 通訊,因為遠端伺服器 API Proxy 網址中提供的主機名稱 (如錯誤 no such host 所示) 無效。

  3. 如果 Apigee Adapter for Envoy 記錄包含顯示 no such host 訊息的記錄項目,這就是問題的原因。如果問題未解決,請參閱 原因:Envoy Proxy 無法與 Apigee Adapter for Envoy 通訊。

解析度

如果 Apigee Adapter for Envoy 記錄檔中顯示上述錯誤,請按照下列步驟解決問題:

  1. 檢查 Apigee Adapter for Envoy 設定檔,並確認指定的遠端服務 API Proxy 網址有效。

    如果不允許,請停止 Apigee Adapter for Envoy、修正設定檔中的遠端服務 API Proxy 網址、啟動 Apigee Adapter for Envoy,然後傳送其他 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 Proxy 已部署在相關的 Edge 環境中。如未顯示,請在相關的 Edge 環境中部署 remote-service API Proxy,然後再試一次。
  3. 驗證 Apigee Adapter for Envoy 和 remote-service API Proxy 端點之間的網路連線。如果發現任何網路連線問題,請與您的網路團隊聯絡,並嘗試解決問題。

原因:Envoy Proxy 無法與 Apigee Adapter for Envoy 通訊

診斷

請按照下列步驟診斷問題:

  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. 檢查 Apigee Adapter for Envoy 記錄,確認是否有包含訊息的記錄項目:
    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 無法與 Apigee Adapter for Envoy 通訊。

  3. connection failure 可能有許多原因。以下逐一介紹不同的情境。

情境 #1:轉接器程序未執行

如果 Apigee Adapter for Envoy 程序未執行,就可能會發生這個錯誤。

  1. 執行下列指令,確認 Apigee Adapter for Envoy 程序正在執行。如果 Apigee Adapter for Envoy 程序正在運作,下方指令的結果應會列出該程序。
    ps -ef | grep apigee-remote-service-envoy
    
  2. 如果伺服器沒有執行,這就是問題的原因。

解析度

  1. 如果 Apigee Adapter for Envoy 程序未執行,請啟動 Apigee Adapter for Envoy。
  2. 請再次提出 API 要求,並確認問題是否已解決。

情境 #2:轉接器程序無法監聽特定通訊埠

如果 Apigee Adapter for Envoy 程序未監聽特定通訊埠,就會發生這個錯誤。

如果 Apigee Adapter for Envoy 程序正在執行,請確認通訊埠 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. 停止 Apigee Adapter for Envoy,然後重新開啟。
  2. 請再次提出 API 要求,並確認問題是否已解決。

情境 #3:Envoy 和 Apigee Adapter for Envoy 之間的網路連線

  1. 確認 Envoy 和 Apigee Adapter for Envoy 之間的網路連線:
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    如果 telnet 能夠與 Apigee Adapter for Envoy 建立 TCP 連線,則將會顯示類似以下的輸出:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    
  2. 如果您在 telnet 中發現 Connection timed out 錯誤,表示 Envoy 和 Apigee Adapter for Envoy 之間發生網路連線問題。

解析度

如果您在 Envoy 和 Apigee Adapter for Envoy 之間發現任何網路連線問題,請與網路團隊聯絡並嘗試解決問題。

如果問題仍未解決,請參閱「必須收集診斷資訊」。

必須收集診斷資訊

如果按照上述說明操作後問題仍未解決,請收集下列診斷資訊,然後與 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 Proxy 中啟動追蹤記錄工作階段。重現這個問題,並提供追蹤工作階段 XML 檔案。

    參考資料: 使用 Trace 工具 | Apigee Edge

  5. Apigee Adapter for Envoy 記錄檔 (與指定時間範圍相關的完整記錄檔)

    獨立部署:

    # 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 Proxy 的 API 要求:
    curl -v ENVOY_PROXY_ENDPOINT
  7. 使用 curl 指令 (curl 指令的完整輸出內容) 傳送至目標服務的 API 要求:
    curl -v TARGET_SERVICE_ENDPOINT