使用 ESPv2 為標準環境設定 Cloud Endpoints OpenAPI

本頁面說明如何設定 App Engine 專用的 Cloud Endpoints。Endpoints 使用可擴充服務 Proxy V2 (ESPv2) 做為 API 閘道。如要為 App Engine 提供 API 管理,您需要先在 Cloud Run 部署預先建構的 ESPv2 容器。接下來要使用 Identity Aware Proxy (IAP) 保護應用程式的安全,以便 ESPv2 叫用。

這項設定完成後,ESPv2 會先攔截所有向您應用程式發出的要求並執行必要的檢查 (例如驗證),然後才叫用應用程式。當應用程式回應時,ESPv2 會收集並回報遙測資料,如下圖所示。您可以在 Google Cloud 主控台的「Endpoints」 >「Services」(服務) 頁面上查看應用程式的指標。

Endpoints 架構

如需 Cloud Endpoints 的總覽資訊,請參閱關於 EndpointsEndpoints 架構

遷移至 ESPv2

先前版本的 Cloud Endpoints 支援搭配使用 可擴充服務 Proxy (ESP) 和 Cloud Run。如果您有現有的 API 想遷移至 ESPv2,請參閱「遷移至可擴充服務 Proxy 第 2 版」一文瞭解詳情。

工作清單

在逐步進行本教學課程時,請使用以下工作清單。您必須完成所有工作,Endpoints 才能管理您的應用程式。

  1. 建立 Google Cloud 專案,如果尚未部署您自己的 App Engine,請部署範例後端應用程式。詳情請參閱事前準備一節。
  2. 設定 IAP 以保護應用程式。詳情請參閱設定 IAP一節。
  3. 為 ESPv2 服務保留 Cloud Run 主機名稱。請參閱「預留 Cloud Run 主機名稱」一文。
  4. 建立說明 API 的 OpenAPI 文件,並設定連至 App Engine 的路徑。請參閱設定 Endpoints 一節。
  5. 部署 OpenAPI 文件以建立代管服務。 請參閱部署 Endpoints 設定一節。
  6. 使用 Endpoints 服務設定建構新的 ESPv2 Docker 映像檔。請參閱「建構新的 ESPv2 映像檔」一文。
  7. 將 ESPv2 容器部署至 Cloud Run。然後將身分與存取權管理 (IAM) 權限授予 ESPv2,以便叫用您的服務。請參閱「部署 ESPv2 容器」一文。
  8. 叫用應用程式。請參閱「傳送要求至 API」一節。
  9. 追蹤應用程式的活動。請參閱追蹤 API 活動一節。
  10. 避免系統向您的 Google Cloud 帳戶收取費用。請參閱「清除所用資源」一節。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

您可以使用 Pricing Calculator 根據預測用量產生預估費用。 新 Google Cloud 使用者可能符合申請免費試用的資格。

完成本文件所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱「清除所用資源」。

事前準備

如何設定:

  1. 在 Google Cloud 控制台中,前往「Manage resources」(管理資源) 頁面,並建立專案。

    前往「Manage resources」(管理資源) 頁面

  2. 請確認您已為專案啟用計費功能。

    瞭解如何啟用計費功能

  3. 記下專案 ID,後續步驟將會用到。在本頁其餘部分,這個專案 ID 又稱為 ESP_PROJECT_ID

  4. 記下專案編號,後續步驟將會用到。在本頁其餘部分,這個專案編號又稱為 ESP_PROJECT_NUMBER

  5. 下載並安裝 Google Cloud CLI。

    下載 gcloud CLI

  6. 如果尚未部署您自己的後端 App Engine,請按照 App Engine 快速入門中的步驟操作。記下部署應用程式的地區和專案 ID。在本頁其餘部分,這個專案 ID 又稱為 APP_PROJECT_ID

設定 IAP 以保護應用程式

您必須使用 Identity Aware Proxy (IAP) 確保已驗證要求,以保護 App Engine 應用程式的安全。

按照啟用 IAP 的步驟操作,並確認您可以登入應用程式。

此外,設定 OAuth 用戶端時,請記下本教學課程中稱為 IAP_CLIENT_ID 的 OAuth client_id

保留 Cloud Run 主機名稱

您必須為 ESPv2 服務預留 Cloud Run 主機名稱,才能設定 OpenAPI 文件或 gRPC 服務設定。如要保留主機名稱,您必須將範例容器部署至 Cloud Run。稍後,您將部署 ESPv2 容器至相同的 Cloud Run 服務。

  1. 確認 gcloud CLI 已獲授權,可存取您的資料和服務。
    1. 登入。
      gcloud auth login
    2. 在開啟的新瀏覽器分頁中,選擇在用於將 ESPv2 部署至 Cloud Run 而建立的 Google Cloud 專案中,具有編輯者擁有者角色的帳戶。
  2. 設定區域。
    gcloud config set run/region us-central1
  3. 將範例映像檔 gcr.io/cloudrun/hello 部署至 Cloud Run。將 CLOUD_RUN_SERVICE_NAME 替換為您想要用於該服務的名稱。
    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
        --image="gcr.io/cloudrun/hello" \
        --allow-unauthenticated \
        --platform managed \
        --project=ESP_PROJECT_ID
    

    成功完成後,這個指令會顯示類似如下的訊息:

    Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-REVISION_NUM] has been deployed and is serving traffic at CLOUD_RUN_SERVICE_URL

    舉例來說,如果您將 CLOUD_RUN_SERVICE_NAME 設為 gateway

    Service [gateway] revision [gateway-00001] has been deployed and is serving traffic at https://gateway-12345-uc.a.run.app

    在這個範例中,https://gateway-12345-uc.a.run.appCLOUD_RUN_SERVICE_URLgateway-12345-uc.a.run.appCLOUD_RUN_HOSTNAME

  4. 請記下 CLOUD_RUN_SERVICE_NAMECLOUD_RUN_HOSTNAME。之後,您會將 ESPv2 部署至 CLOUD_RUN_SERVICE_NAME Cloud Run 服務。您可以在 OpenAPI 文件的 host 欄位中指定 CLOUD_RUN_HOSTNAME

設定 Endpoints

您必須提供符合 OpenAPI 規範 v2.0 的 OpenAPI 文件,此文件須說明您應用程式的介面以及所有驗證需求。此外,您也必須加入內含各應用程式網址的 Google 專用欄位,這樣 ESPv2 才能取得叫用應用程式所需的資訊。如果您還不熟悉 OpenAPI,請參閱 OpenAPI 總覽瞭解詳情。

  1. 建立名為 openapi-appengine.yaml 的文字檔案。(為方便起見,本頁會以該檔案名稱來稱呼 OpenAPI 文件,但是您可以依據需求替該檔案命名)。
  2. 您的 App Engine 後端應用程式會定義於 openapi-appengine.yaml 檔案最上方的 x-google-backend 定義之中,例如:
      swagger: '2.0'
      info:
        title: Cloud Endpoints + App Engine
        description: Sample API on Cloud Endpoints with an App Engine backend
        version: 1.0.0
      host: CLOUD_RUN_HOSTNAME
      schemes:
        - https
      produces:
        - application/json
      x-google-backend:
        address: https://APP_PROJECT_ID.REGION.r.appspot.com
        jwt_audience: IAP_CLIENT_ID
        protocol: h2
      paths:
        /:
          get:
            summary: Greet a user
            operationId: hello
            responses:
              '200':
                description: A successful response
                schema:
                  type: string
    縮排對 yaml 格式來說很重要。例如,host 欄位必須與 info 位於相同層級。
  3. x-google-backend 區段的 address 欄位中,將 APP_PROJECT_ID 替換為您的Google Cloud 專案 ID,將 REGION 替換為您部署 App Engine 的 Google Cloud 地區,並將 IAP_CLIENT_ID 替換為您在設定 IAP 時建立的 OAuth 用戶端 ID。
  4. host 欄位中,指定 CLOUD_RUN_HOSTNAME,也就是在上述「保留 Cloud Run 主機名稱」一節中保留的網址主機名稱部分。請勿加上通訊協定 ID https://,例如:

    swagger: '2.0'
      info:
        title: Cloud Endpoints + App Engine
        description: Sample API on Cloud Endpoints with an App Engine backend
        version: 1.0.0
      host: gateway-12345-uc.a.run.app
  5. 請注意 openapi-appengine.yaml 檔案中的 title 屬性值:

    title: Cloud Endpoints + App Engine

    部署設定後,title 屬性的值就會成為 Endpoints 服務的名稱。

  6. 儲存 OpenAPI 文件

如要瞭解 Endpoints 所需的 OpenAPI 文件欄位,請參閱設定 Endpoints 一文。

部署 Endpoints 設定

如要部署 Endpoints 設定,請使用 gcloud endpoints services deploy 指令。這個指令使用 Service Management 建立代管服務。

如何部署 Endpoints 設定:

  1. 確定您位於內含 OpenAPI 文件的目錄。
  2. 上傳設定並建立代管服務。

    gcloud endpoints services deploy openapi-appengine.yaml \
      --project ESP_PROJECT_ID

    完成後,系統會建立新的 Endpoints 服務,並命名為您在 openapi-appengine.yaml 檔案的 host 欄位中指定的名稱。服務會根據您的 OpenAPI 文件進行設定。

    Service Management 在建立並設定服務時,會把資訊輸出到終端機。部署完成後,您將看到類似以下的訊息:

    Service Configuration [CONFIG_ID] uploaded for service [CLOUD_RUN_HOSTNAME]

    CONFIG_ID 是部署作業建立的 Endpoints 服務設定 ID。例如:

    Service Configuration [2019-02-01r0] uploaded for service [gateway-12345-uc.a.run.app]

    服務設定 ID 是由一個日期戳記和一個修訂版本編號所組成。如果您在同一天再次部署 openapi-appengine.yaml,服務設定 ID 中的修訂版本編號就會遞增。您可以在 Google Cloud 控制台的「Endpoints」>「Services」頁面中查看服務設定和部署記錄

    如果您收到錯誤訊息,請參閱Endpoints 設定部署疑難排解一文。

檢查必要服務

Endpoints 和 ESP 至少需要啟用下列 Google 服務:
名稱 標題
servicemanagement.googleapis.com Service Management API
servicecontrol.googleapis.com Service Control API

在大多數情況下,gcloud endpoints services deploy 指令會啟用這些必要服務。不過在以下情況中,即便您成功執行 gcloud 指令,還是無法啟用必要服務:

  • 您使用 Terraform 之類的第三方應用程式,而其中未包含這些服務。

  • 您已將 Endpoints 設定部署至現有Google Cloud 專案,但在專案中已明確停用這些服務。

使用下列指令確認已啟用必要服務:

gcloud services list

如果必要的服務並未列出,請執行下列指令加以啟用:

gcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com

並啟用 Endpoints 服務:

gcloud services enable ENDPOINTS_SERVICE_NAME

如要判斷 ENDPOINTS_SERVICE_NAME,您可以採取下列任一做法:

  • 部署 Endpoints 設定後,請前往 Cloud 控制台的「Endpoints」頁面。Service name 欄下方會列出可能的 ENDPOINTS_SERVICE_NAME 清單。

  • 針對 OpenAPI,ENDPOINTS_SERVICE_NAME 是您在 OpenAPI 規格 host 欄位中指定的值。針對 gRPC,ENDPOINTS_SERVICE_NAME 是您在 gRPC Endpoints 設定的 name 欄位中指定的值。

如要進一步瞭解 gcloud 指令,請參閱 gcloud 服務

建構新的 ESPv2 映像檔

將 Endpoints 服務設定建構至新的 ESPv2 Docker 映像檔。您稍後會將這個映像檔部署至預留的 Cloud Run 服務。

如要將服務設定建構至新的 ESPv2 Docker 映像檔,請按照下列步驟操作:

  1. 將這個指令碼下載到已安裝 gcloud CLI 的本機電腦。

  2. 使用下列指令執行指令碼:

    chmod +x gcloud_build_image
    
    ./gcloud_build_image -s CLOUD_RUN_HOSTNAME \
        -c CONFIG_ID -p ESP_PROJECT_ID

    針對 CLOUD_RUN_HOSTNAME,請指定您在保留 Cloud Run 主機名稱一節中保留的網址主機名稱。請勿加上通訊協定 ID https://,例如:

    例如:

    chmod +x gcloud_build_image
    
    ./gcloud_build_image -s gateway-12345-uc.a.run.app \
        -c 2019-02-01r0 -p your-project-id
  3. 這個指令碼會使用 gcloud 指令下載服務設定,將服務設定建構至新的 ESPv2 映像檔,然後將新映像檔上傳至專案容器登錄。指令碼會自動使用最新的 ESPv2 版本,這可從輸出映像檔名稱中的 ESP_VERSION 標示得知。輸出圖片會上傳至:

    gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID

    例如:

    gcr.io/your-project-id/endpoints-runtime-serverless:2.14.0-gateway-12345-uc.a.run.app-2019-02-01r0"

部署 ESPv2 容器

  1. 使用上述建構的新映像檔部署 ESPv2 Cloud Run 服務。將 CLOUD_RUN_SERVICE_NAME 替換為您在「保留 Cloud Run 主機名稱」一節中,最初預留上述主機名稱時所用的 Cloud Run 服務名稱:

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \
      --allow-unauthenticated \
      --platform managed \
      --project=ESP_PROJECT_ID
  2. 如果您要設定 Endpoints 以使用其他 ESPv2 啟動選項,例如啟用 CORS,您可以傳送 ESPv2_ARGS 環境變數中的引數:

    gcloud run deploy CLOUD_RUN_SERVICE_NAME \
      --image="gcr.io/ESP_PROJECT_ID/endpoints-runtime-serverless:ESP_VERSION-CLOUD_RUN_HOSTNAME-CONFIG_ID" \
      --set-env-vars=ESPv2_ARGS=--cors_preset=basic \
      --allow-unauthenticated \
      --platform managed \
      --project ESP_PROJECT_ID

    如要進一步瞭解如何設定 ESPv2_ARGS 環境變數,包括可用選項清單,以及如何指定多個選項的資訊,請參閱「Extensible Service Proxy V2 標記」。

  3. 授予 ESPv2 權限,以便叫用受 IAP 保護的應用程式。請對每個服務執行下列指令。在下列指令中:
    • APP_PROJECT_ID 替換為 App Engine 專案 ID 的名稱。
    • ESP_PROJECT_NUMBER 替換為您為 ESPv2 建立的專案「編號」。找到此編號的方法之一,就是前往 IAM 主控台並找到Compute Engine 預設服務帳戶,即 `member` 旗標中使用的服務帳戶。
      gcloud projects add-iam-policy-binding APP_PROJECT_ID \
          --member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
          --role "roles/iap.httpsResourceAccessor"
        

詳情請參閱「使用 IAM 管理存取權」。

傳送要求至 API

本節會說明如何將要求傳送至您的 API。

  1. 建立 Endpoints 服務名稱的環境變數,這是您在 OpenAPI 文件的 host 欄位中指定的名稱,例如:
    • Linux 或 macOS

      export ENDPOINTS_HOST=gateway-12345-uc.a.run.app

    • Windows Powershell

      $Env: ENDPOINTS_HOST="gateway-12345-uc.a.run.app"

Linux 或 Mac OS

使用 curl,透過您在上一步中設定的 ENDPOINTS_HOST 環境變數傳送 HTTP 要求。

curl --request GET \
   --header "content-type:application/json" \
   "https://${ENDPOINTS_HOST}/"

PowerShell

使用 Invoke-WebRequest,透過您在上一步中設定的 ENDPOINTS_HOST 環境變數傳送 HTTP 要求。

(Invoke-WebRequest -Method GET `
    -Headers @{"content-type"="application/json"} `
    -URI "https://$Env:ENDPOINTS_HOST/").Content

在上述範例中,前兩行的結尾為倒引號。當您將範例貼到 PowerShell 中時,請確保倒引號後面沒有空格。 如要瞭解範例要求中使用的選項,請參閱 Microsoft 說明文件中的 Invoke-WebRequest

第三方應用程式

您可以使用第三方應用程式,例如 Chrome 瀏覽器擴充功能 Postman 要求。

  • 選取 GET 做為 HTTP 動詞。
  • 選取 content-type 鍵和 application/json 值做為標頭。
  • 請使用實際網址,而非環境變數,例如:

    https://gateway-12345-uc.a.run.app/
    

如果您未取得成功的回應,請參閱排解回應錯誤一文。

您已在 Endpoints 中部署並測試了 API!

追蹤 API 活動

  1. 在 Google Cloud 主控台的「Endpoints」 >「Service」(服務) 頁面上,查看 API 的活動圖表。

    查看 Endpoints 活動圖表

    要求可能需要一些時間才能反映在圖表中。

  2. 在「Logs Explorer」(記錄檔探索工具) 頁面中查看您的 API 要求記錄。

    查看 Endpoints 要求記錄

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取您在本頁所用資源的費用,請按照下列步驟操作。

如要瞭解如何停用本教學課程使用的服務,請參閱刪除 API 和 API 執行個體一文。

後續步驟