您可以透過 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
建立虛擬私人雲端網路
虛擬私有雲網路是實體網路的虛擬版本,而且已導入 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 執行個體、Cloud Interconnect IP 位址或第 4 層內部負載平衡器。
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
視工作流程的格式而定,請將
JSON_OR_YAML
替換為yaml
或json
。在文字編輯器中,將下列工作流程 (在本例中,工作流程會使用 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 或其他端點。