開始使用 API Gateway 搭配 Cloud Run 和 gRPC
本頁面說明如何設定 API Gateway,以便透過 gRPC 管理及保護 Cloud Run 後端服務。
工作清單
在逐步進行本教學課程時,請使用以下工作清單。您必須完成所有工作,才能為使用 gRPC 的 Cloud Run 後端服務部署 API 閘道。
- 建立或選取 Google Cloud 專案。
- 如果尚未部署您自己的 Cloud Run,請部署範例後端 gRPC 服務。請參閱「事前準備」中的步驟 7。
- 啟用必要的 API Gateway 服務。
- 建立說明 API 的 gRPC API 設定文件,並設定連至 Cloud Run 的路徑。請參閱「使用 gRPC 設定 API 設定」一文。
- 使用 API 設定部署 API 閘道。請參閱「部署 API 閘道」。
- 傳送要求來測試 API 部署作業。請參閱傳送要求至 API 一節。
- 追蹤您服務的活動。請參閱追蹤 API 活動一節。
- 避免系統向您的 Google Cloud 帳戶收取費用。請參閱「清除所用資源」一節。
事前準備
在 Google Cloud 控制台中,前往「Dashboard」頁面,選取或建立 Google Cloud 專案。
請確認您已為專案啟用計費功能。
記下專案 ID,後續步驟將會用到。在本頁其餘部分,這個專案 ID 又稱為 PROJECT_ID。
記下專案編號,後續步驟將會用到。在本頁其餘部分,這個專案編號又稱為 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。
啟用必要服務
API Gateway 要求您啟用下列 Google 服務:
名稱 | 標題 |
---|---|
apigateway.googleapis.com |
API Gateway API |
servicemanagement.googleapis.com |
Service Management API |
servicecontrol.googleapis.com |
Service Control API |
如要確認必要服務已啟用,請執行:
gcloud services list
如果必要的服務並未列出,請執行下列指令加以啟用:
gcloud services enable apigateway.googleapis.comgcloud services enable servicemanagement.googleapis.com
gcloud services enable servicecontrol.googleapis.com
如要進一步瞭解 gcloud
服務,請參閱 gcloud
服務。
使用 gRPC 建立 API 設定
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: "*.apigateway.PROJECT_ID.cloud.goog" title: API Gateway + 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://python-grpc-bookstore-server-HASH-uc.a.run.app
name
欄位必須與type
位於相同層級。 - 在
name
欄位中,指定名為*.apigateway.PROJECT_ID.cloud.goog
的服務,其中 PROJECT_ID 是您的 Google Cloud 專案 ID 名稱。 在
backend.rules
區段的address
欄位中,將 grpcs://python-grpc-bookstore-server-HASH-uc.a.run.app 替換為 python-grpc-bookstore-server 後端 gRPC Cloud Run 服務的實際網址,其中 HASH 是建立服務時產生的不重複雜湊碼。這個範例假設您使用的是「開始之前」一節中建立的 gRPC Bookstore 後端服務。如有需要,請將這個值替換為 Cloud Run 服務的網址。
- 儲存 gRPC API 設定文件。
- 建立 API 設定:
其中:gcloud api-gateway api-configs create CONFIG_ID \ --api=API_ID --project=PROJECT_ID \ --grpc-files=api_descriptor.pb,api_config.yaml
- CONFIG_ID 會指定 API 設定的名稱。
- API_ID 會指定 API 名稱。
- PROJECT_ID 會指定 Google Cloud 專案的名稱。
gcloud api-gateway api-configs create grpc-config \ --api=grpc-test --project=my-test-project \ --grpc-files=api_descriptor.pb,api_config.yaml
部署 API 閘道
如要將 gRPC API 設定部署至閘道,請執行下列指令:
gcloud api-gateway gateways create GATEWAY_ID \ --api=API_ID --api-config=CONFIG_ID \ --location=GCP_REGION --project=PROJECT_ID
其中:
- GATEWAY_ID 會指定閘道的名稱。
- API_ID 會指定與此閘道相關聯的 API Gateway API 名稱。
- CONFIG_ID 會指定部署至閘道的 API 設定名稱。
GCP_REGION 是部署閘道的Google Cloud 區域。
PROJECT_ID 會指定 Google Cloud 專案的名稱。
例如:
gcloud api-gateway gateways create bookstore-grpc \ --api=grpc-test --api-config=grpc-config \ --location=us-central1 --project=my-project
成功完成後,您可以使用下列指令查看網關的詳細資料:
gcloud api-gateway gateways describe GATEWAY_ID \ --location=GCP_REGION --project=PROJECT_ID
請記下這項指令輸出內容中的 defaultHostname
屬性值。這是網關網址的主機名稱部分,您會在下一個步驟中使用這個值測試部署作業。
例如:
https://my-gateway-a12bcd345e67f89g0h.uc.gateway.dev
傳送要求至 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=DEFAULT_HOSTNAME --port 443 --use_tls true
在 DEFAULT_HOSTNAME 中指定閘道的
defaultHostname
屬性,但不含通訊協定 ID。例如:python3 bookstore_client.py --host=my-gateway-a12bcd345e67f89g0h.uc.gateway.dev --port 443 --use_tls true
追蹤 API 活動
在Google Cloud 主控台的「API Gateway」頁面中查看 API 活動圖表。按一下 API,即可在「總覽」頁面中查看活動圖表。要求可能需要一些時間才能反映在圖表中。
在「Logs Explorer」頁面中查看您的 API 要求記錄。您可以在Google Cloud 控制台的「API Gateway」頁面中找到「Logs Explorer」頁面的連結。
進入 API Gateway 頁面後,請按照下列步驟操作:
- 選取要查看的 API。
- 按一下 [Details] (詳細資料) 分頁標籤。
- 按一下「Logs」下方的連結。
您已在 API 閘道中部署並測試了使用 gRPC 的 API!
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取您在本快速入門中所用資源的費用,您可以:
或者,您也可以刪除本教學課程中使用的 Google Cloud 專案。