您可以透過 Workflows 使用 Service Directory 的服務登錄,從工作流程執行作業指定 HTTP 呼叫的私人端點。這樣一來,您就能為工作流程提供 Service Directory 服務名稱。工作流程執行作業會使用從服務登錄檔擷取的資訊,傳送適當的 HTTP 要求,而不會傳出至公用網路。
本文說明如何將虛擬私有雲 (VPC) 網路中的虛擬機器 (VM) 註冊為服務目錄端點:
- 虛擬私有雲網路可為 VM 執行個體提供連線,並讓您使用內部 IP 位址,在虛擬私有雲網路中建立私人端點。系統會透過私人網路將對虛擬私有雲網路資源的 HTTP 呼叫傳送至該資源,同時強制執行 Identity and Access Management (IAM) 和 VPC Service Controls。 
- Service Directory 是服務登錄,可儲存已註冊網路服務的相關資訊,包括名稱、位置和屬性。無論基礎架構為何,您都可以自動註冊服務,並擷取服務詳細資料。這項功能可讓您大規模探索、發布及連結所有服務端點的服務。 
下圖提供概要總覽:
整體來說,您必須執行下列操作:
- 授予 Cloud Workflows 服務代理人權限,以便服務代理人查看 Service Directory 資源,並使用 Service Directory 存取虛擬私有雲網路。
- 建立虛擬私有雲網路,提供網路功能。
- 建立虛擬私有雲防火牆規則,允許或拒絕虛擬私有雲網路中 VM 執行個體的往來流量。
- 在 VPC 網路中建立 VM 執行個體。Compute Engine VM 執行個體是指託管在 Google 基礎架構上的虛擬機器。「Compute Engine 執行個體」、「VM 執行個體」和「VM」這幾個詞是同義詞,可以互換使用。
- 在 VM 上部署應用程式。您可以在 VM 執行個體上執行應用程式,並確認流量是否正常提供。
- 設定 Service Directory,讓工作流程執行作業可以叫用 Service Directory 端點。 
- 建立及部署工作流程。工作流程中的 - private_service_name值會指定您在上一步註冊的 Service Directory 端點。
將權限授予 Cloud Workflows 服務代理人
部分 Google Cloud 服務有服務代理,可讓服務存取您的資源。如果 API 需要服務代理人,Google 會在您啟用及使用 API 後建立服務代理人。
- 首次部署工作流程時,系統會自動建立 Cloud Workflows 服務代理程式,格式如下: - service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com- 您可以在沒有任何工作流程的專案中,使用下列指令手動建立服務帳戶: - gcloud beta services identity create \ --service=workflows.googleapis.com \ --project=PROJECT_ID - 將 - PROJECT_ID替換為專案 ID。 Google Cloud
- 如要查看 Service Directory 資源,請將專案的 Service Directory 檢視者角色 ( - servicedirectory.viewer) 授予 Workflows 服務代理:- gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.viewer - 將 - PROJECT_NUMBER替換為專案編號。 Google Cloud您可以在 Google Cloud 控制台的「歡迎」頁面中找到專案編號,也可以執行下列指令:- gcloud projects describe PROJECT_ID --format='value(projectNumber)' 
- 如要使用 Service Directory 存取虛擬私有雲網路,請將專案的Private Service Connect 授權服務角色 ( - roles/servicedirectory.pscAuthorizedService) 授予 Workflows 服務代理程式:- gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \ --role=roles/servicedirectory.pscAuthorizedService 
Create a VPC network
虛擬私有雲網路是實體網路的虛擬版本,建構於 Google 的正式環境網路之內,這種網路可為您的 Compute Engine VM 執行個體提供連線能力。
您可以建立自動模式或自訂模式的虛擬私有雲網路。您建立的每一個網路,在專案中的名稱均不可重複。
舉例來說,下列指令會建立自動模式 VPC 網路:
gcloud compute networks create NETWORK_NAME \ --subnet-mode=auto
將 NETWORK_NAME 替換為虛擬私有雲網路的名稱。
詳情請參閱「建立及管理虛擬私有雲網路」。
建立虛擬私有雲防火牆規則
虛擬私有雲防火牆規則可讓您根據通訊埠號碼、標記或通訊協定,允許或拒絕進出虛擬私有雲網路中 VM 執行個體的流量。
虛擬私有雲防火牆規則是在網路層級定義,且僅會套用到規則建立時所在的網路。不過,您為規則選擇的名稱在專案內必須為專屬名稱。
舉例來說,下列指令會為您先前建立的虛擬私有雲網路建立防火牆規則。
gcloud compute firewall-rules create RULE_NAME \ --network=projects/PROJECT_ID/global/networks/NETWORK_NAME \ --direction=INGRESS \ --action=ALLOW \ --source-ranges=IP_ADDRESS_RANGE \ --rules=all
更改下列內容:
- RULE_NAME:防火牆規則的名稱。
- IP_ADDRESS_RANGE:一或多個 IPv4 或 IPv6 位址範圍。最佳做法是指定允許存取所需的特定 IP 位址範圍。注意事項:- Service Directory 的私人網路存取權會使用 - 35.199.192.0/19做為僅限內部使用的範圍,下一個躍點完全位於 Google 網路內。詳情請參閱「Cloud DNS 和 Service Directory 的路徑」。
- 如果來源範圍包含 - 35.235.240.0/20,且符合所有其他必要條件,即可使用 Identity-Aware Proxy (IAP) TCP 轉送功能建立 SSH 連線。詳情請參閱「使用 IAP 進行轉送 TCP」。
- 如果您使用瀏覽器中的 SSH 工具,從 Google Cloud 主控台連線至 Compute Engine VM,則須符合特定需求。 
 
- all的- --rules旗標值可讓防火牆規則適用於所有通訊協定和所有目的地通訊埠。您可以指定通訊協定和通訊埠來縮小範圍。
- 您可以選擇使用 - --target-tags和- --target-service-accounts標記定義目標;否則,規則會套用至網路中的所有目標。
詳情請參閱使用虛擬私有雲防火牆規則。
在虛擬私有雲網路中建立 VM 執行個體
VM 執行個體包括 Google Kubernetes Engine (GKE) 叢集、App Engine 彈性環境執行個體,以及其他 Google Cloud 以 Compute Engine VM 為基礎建構的產品。如要支援私有網路存取權,VPC 網路資源可以是 VM 執行個體或其他支援的目的地。詳情請參閱「私人網路存取權總覽」。
Compute Engine 執行個體可執行 Google 提供的 Linux 和 Windows Server 公開映像檔,也可執行您建立或從現有系統匯入的私人自訂映像檔。您也可以部署 Docker 容器。
您可以使用一組預先定義的機器類型,或是建立自己專屬的自訂機器類型,藉此選擇執行個體的機器屬性,例如虛擬 CPU 數量和記憶體數量等。
舉例來說,下列指令會從公用映像檔建立 Linux VM 執行個體,並將網路介面連結至您先前建立的 VPC 網路。
- 建立並啟動 VM 執行個體: - gcloud compute instances create VM_NAME \ --image-family=debian-11 \ --image-project=debian-cloud \ --machine-type=e2-micro \ --network-interface network=projects/PROJECT_ID/global/networks/NETWORK_NAME - 將 - VM_NAME替換為 VM 的名稱。
- 如果系統提示您確認執行個體的可用區,請輸入 - y。- 建立 VM 執行個體後,請記下傳回的 - INTERNAL_IP位址。
- 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面。 
- 在「Name」(名稱) 欄中,按一下適當的 VM 執行個體名稱。 
- 如果 VM 正在執行,請按一下「停止」停止 VM。 
- 如要編輯 VM,請按一下 「編輯」。 
- 在「Networking」(網路) >「Firewalls」(防火牆) 區段中,如要允許 VM 接收 HTTP 或 HTTPS 流量,請選取「Allow HTTP traffic」(允許 HTTP 流量) 或「Allow HTTPS traffic」(允許 HTTPS 流量)。 - 以這個範例來說,請勾選「允許 HTTP 流量」核取方塊。 - Compute Engine 會在 VM 中新增網路標記,將防火牆規則與 VM 建立關聯。然後建立對應的輸入防火牆規則,允許所有流量傳入 - tcp:80(HTTP) 或- tcp:443(HTTPS)。
- 若要儲存變更,請按一下 [儲存]。 
- 如要重新啟動 VM,請按一下「Start/Resume」(啟動/繼續)。 
詳情請參閱「建立及啟動 VM 執行個體」。
在 VM 上部署應用程式
如要測試網路設定,並確認流量是否如預期提供服務,您可以在 VM 上部署監聽通訊埠的基本應用程式。
舉例來說,下列指令會建立 Node.js Web 服務,並監聽 3000 埠。
- 建立與 VM 執行個體的 SSH 連線。 
- 更新套件存放區: - sudo apt update 
- 
詳情請參閱設定 Node.js 開發環境一文。 
- 以互動方式建立 - package.json檔案:- npm init- 例如: - { "name": "test", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "hello" }, "author": "", "license": "ISC" } 
- 安裝 Node.js 的網路應用程式架構 Express: - npm install express 
- 編寫測試應用程式的程式碼: - vim app.js- 下列範例會建立應用程式,以「Hello, world!」文字回應對根路徑 ( - /) 的- GET要求。- 請記下應用程式監聽的通訊埠。為服務目錄服務設定端點時,必須使用相同的連接埠號碼。 
- 確認應用程式正在監聽通訊埠 3000: - node app.js
Compute Engine 提供多種部署選項。詳情請參閱為工作負載選擇 Compute Engine 部署策略。
設定 Service Directory
如要支援從工作流程執行作業叫用私有端點,您必須設定 Service Directory 命名空間、在命名空間中註冊服務,並將端點新增至服務。
舉例來說,下列指令會建立命名空間、服務和端點,指定 VM 執行個體的虛擬私有雲網路和內部 IP 位址。
- 建立命名空間: - gcloud service-directory namespaces create NAMESPACE \ --location=REGION - 更改下列內容: - NAMESPACE:命名空間的 ID 或命名空間的完整 ID。
- REGION:包含命名空間的 Google Cloud 區域,例如- us-central1。
 
- 建立服務: - gcloud service-directory services create SERVICE \ --namespace=NAMESPACE \ --location=REGION - 將 - SERVICE替換為您要建立的服務名稱。
- 設定端點。 - gcloud service-directory endpoints create ENDPOINT \ --namespace=NAMESPACE \ --service=SERVICE \ --network=projects/PROJECT_NUMBER/locations/global/networks/NETWORK_NAME \ --port=PORT_NUMBER \ --address=IP_ADDRESS \ --location=REGION - 更改下列內容: - ENDPOINT:您要建立的端點名稱。
- PORT_NUMBER:端點執行的通訊埠,例如- 3000。
- IP_ADDRESS:端點的 IPv6 或 IPv4 位址;這是您先前記下的內部 IP 位址。
 
建立及部署工作流程
從 Workflows 呼叫或叫用私人端點時,會透過 HTTP 要求進行。最常見的 HTTP 要求方法都有呼叫捷徑 (例如 http.get 和 http.post),但您可以將 call 欄位設為 http.request,並使用 method 欄位指定要求類型,發出任何類型的 HTTP 要求。詳情請參閱「提出 HTTP 要求」。
- 為工作流程建立原始碼檔案: - touch call-private-endpoint.JSON_OR_YAML- 視工作流程的格式而定,以 - yaml或- json取代- JSON_OR_YAML。
- 在文字編輯器中,將下列工作流程 (在本例中,工作流程會使用 HTTP 協定做為 - url值) 複製到來源程式碼檔案:- YAML- main: steps: - checkHttp: call: http.get args: url: http://IP_ADDRESS private_service_name: "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" result: res - ret: return: ${res} - JSON- { "main": { "steps": [ { "checkHttp": { "call": "http.get", "args": { "url": "http://IP_ADDRESS", "private_service_name": "projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE" }, "result": "res" } }, { "ret": { "return": "${res}" } } ] } } - private_service_name值必須是字串,指定已註冊的 Service Directory 服務名稱,格式如下:- projects/PROJECT_ID/locations/LOCATION/namespaces/NAMESPACE_NAME/services/SERVICE_NAME
- 部署工作流程。為進行測試,您可以將 Compute Engine 預設服務帳戶附加至工作流程,代表工作流程的身分: - gcloud workflows deploy call-private-endpoint \ --source=call-private-endpoint.JSON_OR_YAML \ --location=REGION \ --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com 
- 執行工作流程: - gcloud workflows run call-private-endpoint \ --location=REGION - 畫面會顯示類似以下的結果: - argument: 'null' duration: 0.650784403s endTime: '2023-06-09T18:19:52.570690079Z' name: projects/968807934019/locations/us-central1/workflows/call-private-endpoint/executions/4aac88d3-0b54-419b-b364-b6eb973cc932 result: '{"body":"Hello, world!","code":200,"headers":{"Connection":"keep-alive","Content-Length":"21","Content-Type":"text/html; charset=utf-8","Date":"Fri, 09 Jun 2023 18:19:52 GMT","Etag":"W/\"15-NFaeBgdti+9S7zm5kAdSuGJQm6Q\"","Keep-Alive":"timeout=5","X-Powered-By":"Express"}}' startTime: '2023-06-09T18:19:51.919905676Z' state: SUCCEEDED 
後續步驟
- 進一步瞭解 Private Service Connect。
- 設定 Service Directory for GKE。
- 使用 VPC Service Controls 設定服務範圍。
- 啟用 IAP,叫用私有地端部署、Compute Engine、GKE 或其他端點。