透過 ESPv2 為 Cloud Run 設定 Cloud Endpoints gRPC
本頁面說明如何使用 gRPC 後端設定 Cloud Run 專用的 Cloud Endpoints。Endpoints 使用可擴充服務 Proxy V2 (ESPv2) 做為 API 閘道。如要為 Cloud Run 提供 API 管理,您需要先在 Cloud Run 部署預先建構的 ESPv2 容器。接下來要使用 Cloud Run 身分與存取權管理保護服務的安全,以利 ESPv2 叫用。
此設定完成後,ESPv2 會先攔截所有向您服務發出的要求並執行必要的檢查 (例如驗證),然後才叫用服務。當服務回應時,ESPv2 會收集並回報遙測資料,如下圖所示。您可以在 Google Cloud 主控台的「Endpoints」 >「Services」(服務) 頁面查看服務的指標。
如需 Cloud Endpoints 的總覽,請參閱關於 Endpoints 和 Endpoints 架構。
遷移至 ESPv2
先前版本的 Cloud Endpoints 不支援在 Cloud Run 上搭配 ESP 使用 gRPC。如要使用這項功能,請改用可擴充服務 Proxy 第 2 版。
工作清單
在逐步進行本教學課程時,請使用以下工作清單。您必須完成所有工作,才能完成本教學課程。
- 建立 Google Cloud 專案,如果尚未部署您自己的 Cloud Run,請部署範例後端 gRPC 服務。請參閱「事前準備」。
- 為 ESPv2 服務保留 Cloud Run 主機名稱。請參閱「預留 Cloud Run 主機名稱」一文。
- 建立說明 API 的 gRPC API 設定文件,並設定連至 Cloud Run 的路徑。請參閱設定 Endpoints 一節。
- 部署 gRPC API 設定文件,以建立代管服務。請參閱部署 Endpoints 設定一節。
- 使用 Endpoints 服務設定建構新的 ESPv2 Docker 映像檔。請參閱「建構新的 ESPv2 映像檔」一文。
- 將 ESPv2 容器部署至 Cloud Run。然後將身分與存取權管理 (IAM) 權限授予 ESPv2,以便叫用您的服務。請參閱「部署 ESPv2 容器」一文。
- 叫用服務。請參閱傳送要求至 API 一節。
- 追蹤您服務的活動。請參閱追蹤 API 活動一節。
- 避免系統向您的 Google Cloud 帳戶收取費用。請參閱「清除所用資源」一節。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
您可以使用 Pricing Calculator 根據預測用量產生預估費用。
完成本文件所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱「清除所用資源」。
事前準備
如何設定:
在 Google Cloud 控制台中,前往「Manage resources」(管理資源) 頁面,並建立專案。
請確認您已為專案啟用計費功能。
記下專案 ID,後續步驟將會用到。在本頁其餘部分,這個專案 ID 又稱為 ESP_PROJECT_ID。
記下專案編號,後續步驟將會用到。在本頁其餘部分,這個專案編號又稱為 ESP_PROJECT_NUMBER。
下載並安裝 Google Cloud CLI。
按照 gRPC Python 快速入門導覽課程中的步驟安裝 gRPC 和 gRPC 工具。
部署 python-grpc-bookstore-server 範例後端 gRPC Cloud Run 服務,以便搭配本教學課程使用。gRPC 服務會使用下列容器映像檔:
gcr.io/endpointsv2/python-grpc-bookstore-server:2
請按照「快速入門:部署預先建立的範例容器」一文中的步驟部署服務。請務必將快速入門課程中指定的容器映像檔替換為
gcr.io/endpointsv2/python-grpc-bookstore-server:2
請記下服務部署的地區和專案 ID。在本頁其餘部分,這個專案 ID 又稱為 BACKEND_PROJECT_ID。部署的 Cloud Run 服務名稱稱為 BACKEND_SERVICE_NAME。其 Cloud Run 主機名稱稱為 BACKEND_HOST_NAME。
保留 Cloud Run 主機名稱
您必須為 ESPv2 服務預留 Cloud Run 主機名稱,才能設定 OpenAPI 文件或 gRPC 服務設定。如要保留主機名稱,您必須將範例容器部署至 Cloud Run。稍後,您將部署 ESPv2 容器至相同的 Cloud Run 服務。
-
確認 gcloud CLI 已獲授權,可存取您的資料和服務。
- 登入。
gcloud auth login
- 在開啟的新瀏覽器分頁中,選擇在用於將 ESPv2 部署至 Cloud Run 而建立的 Google Cloud 專案中,具有編輯者或擁有者角色的帳戶。
- 登入。
-
設定區域。
gcloud config set run/region us-central1
-
將範例映像檔
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.app
是 CLOUD_RUN_SERVICE_URL,gateway-12345-uc.a.run.app
是 CLOUD_RUN_HOSTNAME。 - 請記下 CLOUD_RUN_SERVICE_NAME 和 CLOUD_RUN_HOSTNAME。之後,您會將 ESPv2 部署至 CLOUD_RUN_SERVICE_NAME Cloud Run 服務。您可以在 OpenAPI 文件的
host
欄位中指定 CLOUD_RUN_HOSTNAME。
設定 Endpoints
bookstore-grpc
範例包含了需要在本機複製及設定的檔案。
- 從您的服務
.proto
檔案中建立獨立的 protobuf 描述元檔案:- 將範例存放區中的
bookstore.proto
複本儲存至目前的工作目錄。這個檔案定義了 Bookstore 服務的 API。 - 在工作目錄下建立以下目錄:
mkdir generated_pb2
- 使用
protoc
通訊協定緩衝區編譯器建立描述元檔案api_descriptor.pb
。在儲存bookstore.proto
的目錄中執行下列指令:python3 -m grpc_tools.protoc \ --include_imports \ --include_source_info \ --proto_path=. \ --descriptor_set_out=api_descriptor.pb \ --python_out=generated_pb2 \ --grpc_python_out=generated_pb2 \ bookstore.proto
在上述指令中,
--proto_path
會設為目前的工作目錄。在您的 gRPC 建構環境中,如果您為.proto
輸入檔案使用不同的目錄,請變更--proto_path
以讓編譯器能夠搜尋您儲存bookstore.proto
的目錄。
- 將範例存放區中的
-
在目前的工作目錄 (包含
bookstore.proto
的目錄) 中建立名為api_config.yaml
的文字檔。為方便起見,本頁會以該檔案名稱來稱呼 gRPC API 設定文件,但您可以依據需求另外替檔案命名。在檔案中新增下列內容: 縮排對 yaml 格式來說很重要。例如,# The configuration schema is defined by the service.proto file. # https://github.com/googleapis/googleapis/blob/master/google/api/service.proto type: google.api.Service config_version: 3 name: CLOUD_RUN_HOSTNAME title: Cloud Endpoints + Cloud Run gRPC apis: - name: endpoints.examples.bookstore.Bookstore usage: rules: # ListShelves methods can be called without an API Key. - selector: endpoints.examples.bookstore.Bookstore.ListShelves allow_unregistered_calls: true backend: rules: - selector: "*" address: grpcs://BACKEND_HOST_NAME
name
欄位必須與type
位於相同層級。 在
name
欄位中,指定 CLOUD_RUN_HOSTNAME,也就是在上述「保留 Cloud Run 主機名稱」一節中保留的網址主機名稱部分。請勿加上通訊協定 ID,例如https://
或grpcs://
。在
backend.rules
區段的address
欄位中,將 BACKEND_HOST_NAME 替換為在事前準備中建立的實際 gRPC Bookstore Cloud Run 服務。請注意
api_config.yaml
檔案中的title
屬性值:title: Cloud Endpoints + Cloud Run gRPC
部署設定後,
title
屬性的值就會成為 Endpoints 服務的名稱。- 儲存 gRPC API 設定文件。
詳情請參閱設定 Endpoints。
部署 Endpoints 設定
如要部署 Endpoints 設定,請使用 gcloud endpoints services deploy
指令。這個指令使用 Service Management 建立代管服務。
- 確認您所在的目錄有
api_descriptor.pb
和api_config.yaml
檔案。 - 確認
gcloud
指令列工具目前使用的預設專案,就是您要部署 Endpoints 設定的 Google Cloud 專案。請利用下列指令傳回的專案 ID 進行驗證,以確保系統沒有將服務建立在錯誤的專案中。gcloud config list project
如要變更預設的專案,請執行下列指令:
gcloud config set project YOUR_PROJECT_ID
- 使用 Google Cloud CLI 部署
proto descriptor
檔案和設定檔:gcloud endpoints services deploy api_descriptor.pb api_config.yaml
Service Management 在建立並設定服務時,會把資訊輸出到終端機。部署完成後,您將看到類似以下的訊息:
Service Configuration [CONFIG_ID] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
CONFIG_ID 是部署作業建立的 Endpoints 服務設定 ID。例如:
Service Configuration [2017-02-13r0] uploaded for service [bookstore.endpoints.example-project.cloud.goog]
在上方範例中,
2017-02-13r0
是服務設定 ID,bookstore.endpoints.example-project.cloud.goog
則是服務名稱。服務設定 ID 是由一個日期戳記和一個修訂版本編號所組成。如果您在同一天再次部署 Endpoints 設定,服務設定 ID 中的修訂編號將會增加。
檢查必要服務
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
服務。
如果您收到錯誤訊息,請參閱排解 Endpoints 設定部署問題一文。
詳情請參閱部署 Endpoints 設定一文。
建構新的 ESPv2 映像檔
將 Endpoints 服務設定建構至新的 ESPv2 Docker 映像檔。您稍後會將這個映像檔部署至預留的 Cloud Run 服務。
如要將服務設定建構至新的 ESPv2 Docker 映像檔,請按照下列步驟操作:
將這個指令碼下載到已安裝 gcloud CLI 的本機電腦。
使用下列指令執行指令碼:
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
-
這個指令碼會使用
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 容器
使用上述建構的新映像檔部署 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
如果您要設定 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 標記」。- 授予 ESPv2 權限,以便叫用 Cloud Run 服務。請對每個服務執行下列指令,在下列指令中:
- 將 BACKEND_SERVICE_NAME 替換為叫用的 Cloud Run 服務名稱。如果您使用的是透過部署 `gcr.io/endpointsv2/python-grpc-bookstore-server:2` 建立的服務,請使用
python-grpc-bookstore-server
做為這個值。 - 將 ESP_PROJECT_NUMBER 替換為您為 ESPv2 建立的專案「編號」。找到此編號的方法之一,就是前往 Google Cloud 主控台的 IAM 頁面,然後找到「預設運算服務帳戶」,即 `member` 標記中使用的服務帳戶。
gcloud run services add-iam-policy-binding BACKEND_SERVICE_NAME \ --member "serviceAccount:ESP_PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role "roles/run.invoker" \ --platform managed \ --project BACKEND_PROJECT_ID
- 將 BACKEND_SERVICE_NAME 替換為叫用的 Cloud Run 服務名稱。如果您使用的是透過部署 `gcr.io/endpointsv2/python-grpc-bookstore-server:2` 建立的服務,請使用
詳情請參閱「使用 IAM 管理存取權」。
傳送要求至 API
如要傳送要求至範例 API,您可以使用以 Python 編寫的範例 gRPC 用戶端。
複製託管 gRPC 用戶端程式碼的 git 存放區:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
變更您的工作目錄:
cd python-docs-samples/endpoints/bookstore-grpc/
安裝依附元件:
pip3 install virtualenv
virtualenv env
source env/bin/activate
pip3 install -r requirements.txt
傳送要求至範例 API:
python3 bookstore_client.py --host CLOUD_RUN_HOSTNAME --port 443 --use_tls true
在 CLOUD_RUN_HOSTNAME 中指定 ESPv2 Cloud Run 服務的主機名稱,但不要加上通訊協定 ID。例如:
python3 bookstore_client.py --host espv2-grpc-HASH-uc.a.run.app --port 443 --use_tls true
在「Endpoints」 >「Services」(服務) 頁面中查看 API 活動圖表。
要求可能需要一些時間才能反映在圖表中。
在「Logs Explorer」(記錄檔探索工具) 頁面中查看您的 API 要求記錄。
如果您未取得成功的回應,請參閱排解回應錯誤一文。
您已在 Endpoints 中部署並測試了 API!
追蹤 API 活動
在 Google Cloud 主控台的「Endpoints」 >「Service」(服務) 頁面上,查看 API 的活動圖表。
要求可能需要一些時間才能反映在圖表中。
在「Logs Explorer」(記錄檔探索工具) 頁面中查看您的 API 要求記錄。
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取您在本頁所用資源的費用,請按照下列步驟操作。
如要瞭解如何停用本教學課程使用的服務,請參閱刪除 API 和 API 執行個體一文。