Proxy Envoy không thành công với lỗi HTTP 403 Forbidden trong Apigee Adapter for Envoy

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

Dấu hiệu

Envoy Proxy gặp lỗi HTTP 403 Forbidden khi được gọi thông qua Apigee Adapter for Envoy.

Thông báo lỗi

Thông báo lỗi sau đây sẽ xuất hiện:

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

Các nguyên nhân có thể

Proxy Envoy sẽ đưa ra lỗi HTTP 403 nếu một trong các điều kiện sau xảy ra:

Nguyên nhân Mô tả Hướng dẫn khắc phục sự cố áp dụng cho
Chưa bật sản phẩm API Chưa bật sản phẩm API cho môi trường cụ thể. Người dùng Edge Public Cloud và Private Cloud
Thiếu đường dẫn URI dịch vụ mục tiêu trong Sản phẩm API Đường dẫn URI của dịch vụ mục tiêu bị thiếu hoặc chưa được thêm vào sản phẩm API trong phần tài nguyên API. Người dùng Edge Public Cloud và Private Cloud
Thiếu tên máy chủ lưu trữ trong Sản phẩm API Tên máy chủ được cung cấp trong yêu cầu API của ứng dụng bị thiếu trong sản phẩm API trong mục đích dịch vụ từ xa của Apigee. Người dùng Edge Public Cloud và Private Cloud
Thiếu khoá API trong tiêu đề của yêu cầu Khoá API không được truyền trong tiêu đề HTTP x-api-key. Người dùng Edge Public Cloud và Private Cloud
Khoá API không hợp lệ Khoá API được truyền dưới dạng một phần của yêu cầu là không hợp lệ. Người dùng Edge Public Cloud và Private Cloud
Apigee Adapter for Envoy không thể giao tiếp với proxy API dịch vụ từ xa Apigee Adapter for Envoy không giao tiếp được với proxy API dịch vụ từ xa. Người dùng Edge Public Cloud và Private Cloud
Proxy Envoy không thể giao tiếp với Apigee Adapter for Envoy Proxy Envoy không thể giao tiếp với Apigee Adapter for Envoy Người dùng Edge Public Cloud và Private Cloud

Trước khi bắt đầu

  1. Xác minh rằng bạn đang nhận được thông báo phản hồi 403 Forbidden từ proxy Envoy. Ví dụ:
    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. Bật nhật ký gỡ lỗi:

    Đảm bảo bạn đã bật nhật ký gỡ lỗi trong Apigee Adapter for Envoy để ghi lại thêm thông tin chi tiết về lỗi. Nếu không, hãy dừng Apigee Adapter for Envoy rồi khởi động lại, bật nhật ký gỡ lỗi bằng lệnh sau:

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

Nguyên nhân: Chưa bật sản phẩm API

Lỗi này sẽ xảy ra nếu Sản phẩm API cụ thể mà Envoy Proxy sử dụng không được bật trong môi trường cụ thể mà các lệnh gọi API được gọi.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng thông báo sau đây xuất hiện trong phần Authorizing request:
    product: API_PRODUCT_NAME not found

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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

    Ví dụ trên cho thấy không tìm thấy sản phẩm API ENVOY-PRODUCT-1 trong Apigee Adapter for Envoy.

    Để biết thêm thông tin về hoạt động ghi nhật ký của Apigee Adapter for Envoy, hãy xem phần Ghi nhật ký.

  3. Nếu bạn thấy thông báo này trong khi uỷ quyền cho yêu cầu API, thì rất có thể thông báo này cho biết rằng Sản phẩm API cụ thể không được bật cho một môi trường cụ thể mà bạn đang thực hiện các lệnh gọi API.
  4. Hãy thực hiện các bước sau để xác minh điều này:
    1. Đăng nhập vào Giao diện người dùng Edge.
    2. Trên trang Phát hành > Sản phẩm API, hãy nhấp vào sản phẩm API cụ thể mà bạn đã dùng để định cấu hình Apigee Adapter for Envoy.
    3. Xác minh rằng môi trường cụ thể mà bạn đang thực hiện các yêu cầu API đã được bật trong sản phẩm API.
    4. Nếu bạn chưa bật môi trường cụ thể trong Sản phẩm API, thì đó là nguyên nhân gây ra vấn đề này.
  5. Nếu môi trường cụ thể đã được bật, hãy chuyển đến Nguyên nhân: Thiếu đường dẫn URI dịch vụ đích trong Sản phẩm API.

Độ phân giải

Nếu môi trường cụ thể không được bật trong sản phẩm API, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Đăng nhập vào Giao diện người dùng Edge.
  2. Trên trang Phát hành > Sản phẩm API, hãy nhấp vào sản phẩm API cụ thể mà bạn đã dùng để định cấu hình Apigee Adapter for Envoy.
  3. Trên trang API products > Product name (Sản phẩm API > Tên sản phẩm), hãy nhấp vào Edit (Chỉnh sửa).
  4. Bật môi trường cụ thể mà bạn muốn thực hiện các yêu cầu API bằng cách chọn hộp đánh dấu môi trường có liên quan.
  5. Nhấp vào Lưu.

Nguyên nhân: Thiếu đường dẫn URI dịch vụ mục tiêu trong sản phẩm API

Lỗi này sẽ xảy ra nếu đường dẫn URI của mục tiêu không được chỉ định trong Sản phẩm API cụ thể mà Envoy Proxy sử dụng.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng thông báo sau đây xuất hiện cho Sản phẩm API cụ thể được liên kết với một mục tiêu cụ thể trong phần Authorizing request:

    no path: REQUEST_URI_PATH

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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)

    Đầu ra mẫu cho thấy thông báo:

    no path: /echo1

    Điều này cho biết không tìm thấy đường dẫn /echo1 trong sản phẩm API ENVOY-PRODUCT-1.

  3. Nếu bạn thấy thông báo no path: REQUEST_URI_PATH trong nhật ký gỡ lỗi Apigee Adapter for Envoy, thì đó là nguyên nhân gây ra vấn đề này. Nếu không, hãy chuyển đến phần Nguyên nhân: Thiếu tên máy chủ lưu trữ trong sản phẩm API.

Độ phân giải

Nếu URI yêu cầu cụ thể không được thêm vào API Product cho mục tiêu cụ thể, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Đăng nhập vào Giao diện người dùng Edge.
  2. Trên trang Phát hành > Sản phẩm API, hãy nhấp vào sản phẩm API cụ thể mà bạn đã dùng để định cấu hình Apigee Adapter for Envoy.
  3. Trên trang API products > Product name (Sản phẩm API > Tên sản phẩm), hãy nhấp vào Edit (Chỉnh sửa).
  4. Trong ngăn Tài nguyên API, hãy thêm URI yêu cầu API vào sản phẩm API.
  5. Theo dõi nhật ký Apigee Adapter for Envoy và đợi cho đến khi Apigee Adapter for Envoy tìm nạp sản phẩm API đã cập nhật. Sau đó, hãy gửi một yêu cầu API khác để xác minh bản sửa lỗi.

Nguyên nhân: Thiếu tên máy chủ trong sản phẩm API

Lỗi này sẽ xảy ra nếu bạn không thêm tổ hợp tên máy chủ và cổng đích vào Sản phẩm API cụ thể mà Envoy Proxy sử dụng.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng thông báo sau đây xuất hiện cho Sản phẩm API cụ thể được liên kết với một mục tiêu cụ thể trong phần Authorizing request:

    no targets: HOSTNAME:PORT

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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)

    Ví dụ trên cho thấy rằng tổ hợp tên máy chủ lưu trữ và cổng httpbin1:8080 không có trong sản phẩm API ENVOY-PRODUCT-1.

  3. Nếu nhật ký Apigee Adapter for Envoy chứa một mục có thông báo no targets: HOSTNAME:PORT trong khi uỷ quyền cho yêu cầu, thì đây là nguyên nhân gây ra vấn đề. Nếu không, hãy chuyển đến phần Nguyên nhân: Thiếu khoá API trong tiêu đề của yêu cầu.

Độ phân giải

Nếu bạn chưa thêm tổ hợp tên máy chủ và cổng mục tiêu vào sản phẩm API, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Đăng nhập vào Giao diện người dùng Edge.
  2. Trên trang Phát hành > Sản phẩm API, hãy nhấp vào sản phẩm API cụ thể mà bạn đã dùng để định cấu hình Apigee Adapter for Envoy.
  3. Trên trang API products > Product name (Sản phẩm API > Tên sản phẩm), hãy nhấp vào Edit (Chỉnh sửa).
  4. Trong ngăn Apigee remote service targets (Mục tiêu dịch vụ từ xa của Apigee), hãy thêm tên máy chủ mục tiêu và cổng, rồi nhấp vào Save (Lưu).

    Nếu bạn không thấy phần Apigee remote service targets (Mục tiêu dịch vụ từ xa của Apigee) trong giao diện người dùng, hãy thêm một thuộc tính tùy chỉnh vào sản phẩm API có tên apigee-remote-service-targets và thêm giá trị HOSTNAME:PORT bằng Edge API. Ví dụ:

    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. Sau khi hoàn tất tác vụ trên, hãy theo dõi nhật ký Apigee Adapter for Envoy và đợi cho đến khi Apigee Adapter for Envoy tìm nạp sản phẩm API đã cập nhật. Sau đó, hãy gửi một yêu cầu API khác để xác minh bản sửa lỗi.

Nguyên nhân: Thiếu khoá API trong tiêu đề của yêu cầu

Lỗi này sẽ xảy ra nếu Khoá API không được truyền dưới dạng một phần của tiêu đề yêu cầu.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng bạn thấy thông báo [missing authentication] trong phần Authenticate error.

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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

    Đầu ra mẫu ở trên có thông báo [missing authentication]. Thông báo này cho biết khoá API không được truyền dưới dạng một phần của tiêu đề của yêu cầu.

  3. Nếu nhật ký Apigee Adapter for Envoy chứa một mục nhập nhật ký có thông báo [missing authentication] trong phần Authenticate error , thì đây là nguyên nhân gây ra vấn đề. Nếu không, hãy chuyển đến phần Nguyên nhân: Khoá API không hợp lệ.

Độ phân giải

Nếu lỗi [missing authentication] xuất hiện trong nhật ký Apigee Adapter for Envoy, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Kiểm tra xem ứng dụng đã gửi khoá API bằng tiêu đề HTTP x-api-key trong yêu cầu API hay chưa. Nếu không, hãy yêu cầu ứng dụng gửi khoá API trong tiêu đề HTTP x-api-key.
  2. Kiểm tra tệp cấu hình Apigee Adapter for Envoy và xác minh rằng tên tiêu đề khoá API mặc định x-api-key đã được thay đổi, ví dụ:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        global:
          tls:
            ...
        tenant:
          ...
        auth:
          target_header: api-key

    Trong ví dụ trên, tên tiêu đề Khoá API mặc định đã được sửa đổi thành api-key. Trong trường hợp này, bạn cần truyền Khoá API trong phần đầu api-key.

  3. Nếu tên tiêu đề khoá API mặc định đã thay đổi, hãy yêu cầu ứng dụng khách sử dụng tên tiêu đề khoá API mới cập nhật và gửi một yêu cầu API khác, đồng thời xác minh xem yêu cầu đó có giải quyết được vấn đề hay không.

Nguyên nhân: Khoá API không hợp lệ

Lỗi này sẽ xảy ra nếu Khoá API không hợp lệ được truyền dưới dạng một phần của tiêu đề của yêu cầu.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng bạn thấy thông báo [permission denied] trong phần Authenticate error. Thông báo này thường xuất hiện sau khi Khoá API được Adapter tìm nạp, được biểu thị bằng thông báo fetchToken fetching: API_KEY.

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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)

    Trong ví dụ này, khoá API được gửi trong yêu cầu API không hợp lệ.

  3. Nếu nhật ký Apigee Adapter for Envoy chứa một mục nhập nhật ký có [permission denied] trong phần Authenticate error , thì điều đó có nghĩa là khoá API được truyền dưới dạng một phần của yêu cầu không hợp lệ và là nguyên nhân gây ra vấn đề. Nếu không, hãy chuyển đến phần Nguyên nhân: Apigee Adapter for Envoy không thể giao tiếp với proxy API dịch vụ từ xa.

Độ phân giải

Nếu bạn thấy thông báo [permission denied] trong phần Authenticate error trong nhật ký Apigee Adapter for Envoy, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Kiểm tra khoá API được gửi trong yêu cầu API dựa trên giá trị khoá API có trong ứng dụng được kết nối với sản phẩm API.
  2. Nếu khoá API mà ứng dụng sử dụng không hợp lệ, hãy yêu cầu ứng dụng gửi khoá API hợp lệ.
  3. Nếu khoá API mà ứng dụng sử dụng là hợp lệ và bạn vẫn gặp lỗi 403 HTTP, vui lòng liên hệ với Nhóm hỗ trợ Apigee Edge để điều tra thêm về vấn đề này.

Nguyên nhân: Apigee Adapter for Envoy không thể giao tiếp với proxy API dịch vụ từ xa

Lỗi này sẽ xảy ra nếu Apigee Adapter for Envoy không thể giao tiếp với Remote Service API Proxy nếu máy chủ dịch vụ từ xa được định cấu hình không hợp lệ.

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Bật nhật ký gỡ lỗi như giải thích trong bước 2 ở trên.
  2. Kiểm tra nhật ký của Apigee Adapter for Envoy và xác minh rằng bạn thấy thông báo sau:

    Error retrieving products: REQUEST_URI: no such host

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

    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

    Trong ví dụ này, Apigee Adapter for Envoy không thể giao tiếp với API remote-service vì tên máy chủ được cung cấp trong URL của API Proxy trên máy chủ từ xa không hợp lệ như được chỉ ra bởi lỗi no such host .

  3. Nếu nhật ký Apigee Adapter for Envoy chứa một mục nhập nhật ký có thông báo no such host, thì đây là nguyên nhân gây ra vấn đề. Nếu không, hãy chuyển đến phần Nguyên nhân: Proxy Envoy không thể giao tiếp với Apigee Adapter for Envoy.

Độ phân giải

Nếu các lỗi trên xuất hiện trong nhật ký Apigee Adapter for Envoy, hãy thực hiện các bước sau để giải quyết vấn đề:

  1. Kiểm tra tệp cấu hình Apigee Adapter for Envoy và xác minh rằng URL của API proxy remote-service đã cho là hợp lệ.

    Nếu không, hãy dừng Apigee Adapter for Envoy, sửa URL của proxy API dịch vụ từ xa trong tệp cấu hình, khởi động Apigee Adapter for Envoy, gửi một yêu cầu API khác và xác minh bản sửa lỗi.

    Cấu hình mẫu:

    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. Xác minh rằng proxy API remote-service được triển khai trong môi trường Edge có liên quan. Nếu không, hãy triển khai proxy API remote-service trong môi trường Edge có liên quan rồi thử lại.
  3. Xác minh khả năng kết nối mạng giữa Apigee Adapter for Envoy và điểm cuối của proxy API remote-service. Nếu bạn phát hiện thấy vấn đề về kết nối mạng, hãy liên hệ với nhóm mạng của bạn và cố gắng giải quyết vấn đề.

Nguyên nhân: Proxy Envoy không thể giao tiếp với Apigee Adapter for Envoy

Chẩn đoán

Hãy thực hiện các bước sau để chẩn đoán vấn đề:

  1. Đảm bảo bạn đã bật nhật ký gỡ lỗi trong Envoy. Nếu không, hãy dừng Envoy rồi khởi động lại, đồng thời bật nhật ký gỡ lỗi. Sau đó, hãy gửi một yêu cầu API khác.

    Triển khai độc lập:

    envoy -c envoy-config.yaml -l debug

    Triển khai dựa trên 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. Kiểm tra nhật ký Apigee Adapter for Envoy và xác minh rằng có một mục nhập nhật ký có thông báo:
    connecting to APIGEE_ENVOY_ADAPTER_HOST:5000

    sau đó là:

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

    Ví dụ về đầu ra của nhật ký gỡ lỗi:

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

    Ví dụ trên cho thấy Envoy không thể giao tiếp với Apigee Adapter for Envoy vì lý do connection failure.

  3. Biểu tượng connection failure có thể xuất hiện vì nhiều lý do. Hãy xem xét từng trường hợp.

Tình huống 1: Quy trình của bộ chuyển đổi không chạy

Nếu quy trình Apigee Adapter for Envoy không chạy, thì lỗi này có thể xảy ra.

  1. Xác minh rằng quy trình Apigee Adapter for Envoy đang chạy bằng cách thực thi lệnh sau. Nếu quy trình Apigee Adapter for Envoy đang chạy, kết quả của lệnh sau sẽ liệt kê quy trình đó.
    ps -ef | grep apigee-remote-service-envoy
  2. Nếu không chạy, thì đó là nguyên nhân gây ra vấn đề.

Độ phân giải

  1. Nếu quy trình Apigee Adapter for Envoy không chạy, hãy khởi động Apigee Adapter for Envoy.
  2. Gửi một yêu cầu khác đến API và xác minh xem vấn đề đã được khắc phục hay chưa.

Tình huống 2: Quy trình bộ chuyển đổi không nghe trên cổng cụ thể

Nếu quy trình Apigee Adapter for Envoy không theo dõi trên cổng cụ thể, thì có thể xảy ra lỗi này.

Nếu quy trình Apigee Adapter for Envoy đang chạy, hãy xác minh rằng có một socket đang nghe trên cổng 5000: APIGEE_ENVOY_ADAPTER_HOST:5000. Bạn có thể chạy lệnh netstat để xác minh điều này:

sudo netstat -lnp | grep 5000

Đầu ra mẫu:

sudo netstat -lnp | grep 5000

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

Nếu không có socket nào đang nghe trên cổng 5000, thì đó có thể là nguyên nhân gây ra vấn đề này.

Độ phân giải

  1. Dừng Apigee Adapter for Envoy rồi khởi động lại.
  2. Gửi một yêu cầu khác đến API và xác minh xem vấn đề đã được khắc phục hay chưa.

Tình huống 3: Khả năng kết nối mạng giữa Envoy và Apigee Adapter for Envoy

  1. Xác minh khả năng kết nối mạng giữa Envoy và Apigee Adapter for Envoy:
    ssh $ENVOY_HOST
    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000

    Nếu telnet có thể tạo một kết nối TCP đến Apigee Adapter for Envoy, thì một đầu ra tương tự như sau sẽ xuất hiện:

    telnet $APIGEE_ENVOY_ADAPTER_HOST 5000
    
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
  2. Nếu bạn thấy lỗi Connection timed out bằng telnet, thì điều đó cho thấy có vấn đề về khả năng kết nối mạng giữa Envoy và Apigee Adapter for Envoy.

Độ phân giải

Nếu bạn gặp bất kỳ vấn đề nào về khả năng kết nối mạng giữa Envoy và Apigee Adapter for Envoy, vui lòng liên hệ với nhóm mạng của bạn và cố gắng giải quyết vấn đề.

Nếu vấn đề vẫn tiếp diễn, hãy chuyển đến phần Phải thu thập thông tin chẩn đoán.

Phải thu thập thông tin chẩn đoán

Nếu vấn đề vẫn tiếp diễn sau khi bạn làm theo hướng dẫn ở trên, hãy thu thập thông tin chẩn đoán sau đây rồi liên hệ với Nhóm hỗ trợ Apigee Edge:

  1. Sản phẩm Apigee được sử dụng:

    Ví dụ: Apigee Edge Cloud, Apigee OPDK, Apigee hybrid, Apigee X

  2. Tổ chức và môi trường Apigee
  3. Định nghĩa sản phẩm API được đọc bằng Edge API:

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

    Tài liệu tham khảo: Apigee Edge API

  4. Bắt đầu một phiên theo dõi trong proxy API remote-service bằng giao diện người dùng Apigee Edge. Tái hiện vấn đề này và chia sẻ tệp XML của phiên theo dõi.

    Tài liệu tham khảo: Sử dụng công cụ Theo dõi | Apigee Edge

  5. Nhật ký Apigee Adapter for Envoy (nhật ký đầy đủ liên quan đến khoảng thời gian nhất định)

    Triển khai độc lập:

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

    Triển khai dựa trên Kubernetes/Istio:

    kubectl -n=apigee get pods
    kubectl -n=apigee logs APIGEE_REMOTE_SERVICE_ENVOY_POD_NAME > apigee-remote-service-envoy.log
  6. Một yêu cầu API được gửi đến proxy Envoy bằng lệnh curl (đầu ra hoàn chỉnh của lệnh curl):
    curl -v ENVOY_PROXY_ENDPOINT
  7. Một yêu cầu API được gửi đến dịch vụ mục tiêu bằng lệnh curl (toàn bộ đầu ra của lệnh curl):
    curl -v TARGET_SERVICE_ENDPOINT