作業指南

本頁適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

如何取得 API 金鑰

以下範例說明如何取得 API 金鑰,以便驗證透過 Apigee Adapter for Envoy 代理的目標服務 API 呼叫。

1. 登入 Apigee

  1. 登入 Apigee UI
  2. 選取您用於為 Envoy 佈建 Apigee 轉接器的機構。

2. 可建立開發人員

您可以使用現有的開發人員進行測試,也可以按照下列步驟建立新的開發人員:

  1. 在側邊導覽選單中,依序選取「發布」>「開發人員」
  2. 按一下「+ 開發人員」
  3. 填寫對話方塊,建立新的開發人員。您可以使用任何開發人員名稱/電子郵件地址。

3. 可建立 API 產品

請參考下方提供的產品建立範例。

  1. 在側邊導覽選單中,依序選取「發布」>「API 產品」
  2. 按一下「+ 建立」
  3. 按照下列指示填寫「產品詳細資料」部分。下表僅列出必填欄位:
    欄位 說明
    名稱 httpbin-product API 產品的專屬名稱。
    顯示名稱 httpbin product 您希望在 UI 或其他顯示情境中看到的描述性名稱。
    存取權 Public 在本例中,公開是較好的選擇。
  4. 在「操作」部分中,按一下「+ 新增操作」
  5. 在「Source」部分,選取「Remote Service」
  6. 切換「Source」切換鈕,即可在「Remote Service」欄位中手動輸入遠端服務的名稱。
  7. 在「Remote Service」欄位中輸入遠端服務名稱。這是轉接器代理傳入 HTTP 要求的目標服務。如要進行測試,請使用 httpbin.orghttpbin.default.svc.cluster.local 搭配 Kubernetes。

    選取「Remote Service」圓形按鈕、啟用手動文字輸入功能,並在「Remote Service」欄位中輸入遠端服務 httpbin.org。

  8. 在「Operation」部分的路徑中,輸入 /。如要瞭解路徑選項,請參閱「設定資源路徑」。
  9. 按一下「儲存」,儲存操作。
  10. 按一下「儲存」,即可儲存 API 產品。

詳情請參閱「管理 API 產品」。

4. 可建立開發人員應用程式

開發人員應用程式包含 API 金鑰,這是透過轉接程式發出 API Proxy 呼叫所需的金鑰。

  1. 選取側邊導覽選單中的「發布應用程式」
  2. 按一下「+ 應用程式」
  3. 按照下列指示填寫「應用程式詳細資料」部分。下表僅列出必填欄位:
  4. 名稱 httpbin-app
    開發人員 選取先前建立的開發人員,或從清單中選擇任何開發人員。
  5. 在「憑證」部分中,按一下「+ 新增產品」,然後選取剛剛設定的產品:httpbin-product
  6. 按一下 [建立]。
  7. 在「憑證」下方,按一下「金鑰」旁的「顯示」
  8. 複製 Consumer Key 的值。這個值是您透過 Envoy 的 Apigee 轉接器,對 httpbin 服務發出 API 呼叫時要使用的 API 金鑰

使用以 JWT 為基礎的驗證機制

您可以使用 JWT 權杖來發出經過驗證的 API Proxy 呼叫,而非使用 API 金鑰。本節說明如何使用 apigee-remote-service-cli token 指令建立、檢查及輪替 JWT 權杖。針對 Apigee 混合式環境,您可以使用此指令建立 Kubernetes 秘密,用於保存 JWT。

總覽

Envoy 會使用其 JWT 驗證篩選器處理 JWT 驗證和驗證作業。

驗證完成後,Envoy ext-authz 篩選器會將要求標頭和 JWT 傳送至 apigee-remote-service-envoy。這項工具會比對 JWT 的 api_product_listscope 宣告與 Apigee API 產品,以便針對要求的目標授權。

建立 Apigee JWT 權杖

您可以使用 CLI 建立 Apigee JWT 權杖:

apigee-remote-service-cli token create -c config.yaml --id $KEY --secret $SECRET

或者,您也可以使用標準 OAuth 權杖端點。Curl 範例:

curl https://org-env.apigee.net/remote-token/token -d '{"client_id":"myclientid","client_secret":"myclientsecret","grant_type":"client_credentials"}' -H "Content-type: application/json"

使用 JWT 權杖

取得權杖後,只要在授權標頭中將權杖傳遞給 Envoy 即可。範例:

curl localhost:8080/httpbin/headers -i -H "Authorization:Bearer $TOKEN"

JWT 權杖失敗

Envoy 拒絕

如果 Envoy 拒絕權杖,您可能會看到類似以下的訊息:

Jwks remote fetch has failed

如果是,請確認 Envoy 設定在 remote_jwks 區段中包含有效的 URI,且 Envoy 可存取該 URI,並在安裝 Apigee Proxy 時正確設定憑證。您應該可以直接使用 GET 呼叫呼叫 URI,並收到有效的 JSON 回應。

範例:

curl https://myorg-eval-test.apigee.net/remote-service/certs

Envoy 傳送的其他訊息可能如下所示:

  • 「不允許使用 JWT 中的目標對象」
  • 「未設定 JWT 核發者」

這些是 Envoy 設定中可能需要修改的必要條件。

檢查符記

您可以使用 CLI 檢查權杖。範例

apigee-remote-service-cli -c config.yaml token inspect -f path/to/file

apigee-remote-service-cli -c config.yaml token inspect <<< $TOKEN

偵錯

請參閱「有效的 API 金鑰失敗」。

使用您自己的身分識別提供者

根據預設,Envoy 適用的 Apigee 轉接器會使用 remote-token API 代理程式做為身分提供者服務,以便驗證用戶端應用程式,並根據 OAuth 2.0 用戶端憑證授權類型提供 JWT 權杖。不過,在某些情況下,您可能無法使用 remote-token Proxy。如果您必須使用非 Apigee 提供的識別資訊提供者,可以設定轉接器以使用其他識別資訊提供者。如要進一步瞭解這項非 Apigee 身分提供者的用途和必要設定,請參閱 Apigee 社群的這篇文章: 使用自有身分提供者搭配 Apigee Envoy 轉接器

記錄

您可以調整 $REMOTE_SERVICE_HOME/apigee-remote-service-envoy 服務的記錄層級。所有記錄都會傳送至 stderr。

元素 必填 說明
-l、--log-level 有效等級:debug、info、warn、error。 調整記錄層級。預設值:info
-j、--json-log 以 JSON 記錄格式產生記錄輸出內容。

Envoy 提供記錄功能。如需更多資訊,請參閱下列 Envoy 說明文件連結:

變更政策密鑰名稱

部署至叢集的 Kubernetes 密鑰包含轉接器需要的憑證,用於驗證與遠端服務 Proxy 的通訊。這個密鑰需要可設定的磁碟區掛接點。根據預設,掛載點為 /policy-secret。如要變更掛載點,請按照下列步驟操作:

  1. 執行以下指令:
    $REMOTE_SERVICE_HOME/apigee-remote-service-envoy --policy-secret '/new-mount_point_name

    例如:

    $REMOTE_SERVICE_HOME/apigee-remote-service-envoy --policy-secret '/my-mount-point
  2. 在編輯器中開啟 $CLI_HOME/samples/apigee-envoy-adapter.yaml
  3. 將掛接點名稱變更為新名稱:
    volumeMounts:
      - mountPath: /config
        name: apigee-remote-service-envoy
        readOnly: true
      - mountPath: /opt/apigee/tls
        name: tls-volume
        readOnly: true
      - mountPath: /my-mount-point
        name: policy-secret
        readOnly: true
  4. 儲存檔案並套用至服務中介:
    kubectl apply -f $REMOTE_SERVICE_HOME/samples/apigee-envoy-adapter.yaml

使用網路 Proxy

您可以在 apigee-remote-service-envoy 二進位檔的環境中使用 HTTP_PROXY 和 HTTPS_PROXY 環境變數,插入 HTTP Proxy。使用這些變數時,您也可以使用 NO_PROXY 環境變數,排除透過 Proxy 傳送的特定主機。

HTTP_PROXY=http://[user]:[pass]@[proxy_ip]:[proxy_port]
HTTPS_PROXY=http://[user]:[pass]@[proxy_ip]:[proxy_port]
NO_PROXY=127.0.0.1,localhost

請注意,Proxy 必須可從 apigee-remote-service-envoy 存取。

關於指標和數據分析

:5001/metrics 提供 Prometheus 指標端點。您可以設定這個通訊埠編號。請參閱「設定檔」。

Envoy 數據分析

以下連結提供有關取得 Envoy 代理伺服器分析資料的資訊:

Istio 數據分析

以下連結提供有關取得 Envoy 代理伺服器分析資料的資訊:

Apigee 數據分析

Envoy 的 Apigee 遠端服務會將要求統計資料傳送至 Apigee,以便進行數據分析。Apigee 會以相關 API 產品名稱回報這些要求。

如要瞭解 Apigee Analytics,請參閱「Analytics 服務總覽」。

支援多租戶環境

您現在可以啟用轉接器,為 Apigee 機構中的多個環境提供服務。這項功能可讓您使用與一個 Apigee 機構相關聯的一個 Apigee Adapter for Envoy,為多個環境提供服務。在這項變更之前,一個轉接程式一律會繫結至一個 Apigee 環境。

如要設定多個環境支援,請將 config.yaml 檔案中的 tenant:env_name 值變更為 "*"。例如:

  1. 在編輯器中開啟 config.yaml 檔案。
  2. tenant.env_name 的值變更為 "*"。例如:
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: apigee-remote-service-envoy
      namespace: apigee
    data:
      config.yaml: |
        tenant:
          remote_service_api: https://apitest.mydomain.net/remote-service
          org_name: my-org
          env_name: "*""
          allow_unverified_ssl_cert: true
        analytics:
          collection_interval: 10s
        auth:
          jwt_provider_key: https://apitest.mydomain.net/remote-token/token
  3. 儲存檔案。
  4. 套用檔案:
    kubectl apply -f $CLI_HOME/config.yaml

設定多環境模式時,您也必須設定 Envoy,讓 Envoy 將適當的環境值傳送至轉接器,方法是在 envoy-config.yaml 檔案的 virtual_hosts:routes 部分新增下列中繼資料。例如:

  1. 使用 CLI 產生 envoy-config.yaml 檔案。例如:
    $CLI_HOME/apigee-remote-service-cli samples create \
      -t envoy-1.16 -c ./config.yaml --out myconfigs
  2. 開啟產生的檔案 (名為 envoy-config.yaml)。
  3. 在檔案的 virtual_hostroutes 部分新增下列中繼資料:
    typed_per_filter_config:
      envoy.filters.http.ext_authz:
        "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute
        check_settings:
          context_extensions:
            apigee_environment: test

    以下範例說明 virtual_host 的設定,其中定義了多個路徑,每個路徑都會將流量傳送至特定環境:

    filter_chains:
        - filters:
          - name: envoy.filters.network.http_connection_manager
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
              stat_prefix: ingress_http
              route_config:
                virtual_hosts:
                - name: default
                  domains: "*"
                  routes:
                  - match: { prefix: /test }
                    route:
                      cluster: httpbin
                    typed_per_filter_config:
                      envoy.filters.http.ext_authz:
                        "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute
                        check_settings:
                          context_extensions:
                             apigee_environment: test
                  - match: { prefix: /prod }
                    route:
                      cluster: httpbin
                    typed_per_filter_config:
                      envoy.filters.http.ext_authz:
                        "@type": type.googleapis.com/envoy.extensions.filters.http.ext_authz.v3.ExtAuthzPerRoute
                        check_settings:
                          context_extensions:
                             apigee_environment: prod
  4. 視需要重複上一個步驟,新增其他環境。
  5. 儲存並套用檔案。

擷取自訂報表的資料

轉接程式支援將 Envoy 中繼資料傳遞至 Apigee 的資料擷取功能,該功能會將您指定的變數中擷取的資料傳送至 Apigee 分析,以便在自訂報表中使用。這項功能提供的功能類似於 Apigee 的資料擷取政策

如何使用這項功能:

  1. 建立 資料收集器 REST 資源
  2. 使用 Apigee datacollectors API 定義資料擷取變數。
  3. 如果您尚未使用 CLI 產生 envoy-config.yaml 檔案,例如:
    $CLI_HOME/apigee-remote-service-cli samples create \
      -t envoy-1.16 -c ./config.yaml --out myconfigs
  4. 開啟產生的檔案 (名為 envoy-config.yaml)。
  5. 使用 Envoy 篩選器,在 envoy.filters.http.apigee.datacapture 命名空間中設定自訂變數的值。 舉例來說,您可以使用「Header to Metadata」篩選器或「Lua」篩選器。 如要進一步瞭解這些篩選器,請參閱「標頭至中繼資料」和「Lua」。

    自訂變數名稱格式必須為 dc.XXXXX

    標頭到中繼資料篩選器範例:

     - name: envoy.filters.http.header_to_metadata
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.http.header_to_metadata.v3.Config
        request_rules:
          - header: "Host"
            on_header_present:
              metadata_namespace: envoy.filters.http.apigee.datacapture
              key: dc.host  # host (without the prefix) also works
              type: STRING
            remove: false

    Lua 篩選器範例:

    - name: envoy.filters.http.lua
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
        inline_code: |
          function envoy_on_request(request_handle)
            metadata = request_handle:streamInfo():dynamicMetadata()
            metadata:set("envoy.filters.http.apigee.datacapture", "dc.test", "A test string.")
          end
  6. 將所需濾鏡新增至檔案。請參閱下方範例。
  7. 儲存並套用檔案。

在轉接程式與 Apigee 執行階段之間設定 mTLS

您可以在轉接程式的 config.yaml 檔案 tenant 專區中提供用戶端傳輸層安全標準 (TLS) 憑證,以便在轉接程式和 Apigee 執行階段之間使用 mTLS。這項異動適用於所有支援的 Apigee 平台。也能為 Apigee Edge for Private Cloud 平台啟用 mTLS 進行數據分析。例如:

tenant:
  tls:
    ca_file: path/ca.pem
    cert_file: path/cert.pem
    key_file: path/key.pem
    allow_unverified_ssl_cert: false