您可以使用 Service Directory 的服務註冊表搭配工作流程,指定工作流程執行作業的 HTTP 呼叫私人端點。在虛擬私有雲 (VPC) 網路中建立私人端點,即可讓端點符合 VPC 服務控管規定。
VPC Service Controls 可提供額外一層安全防護,不受身分與存取權管理 (IAM) 影響。Cloud IAM 提供精細的「身分式存取權控管功能」,VPC Service Controls 則提供較廣泛的「情境式範圍安全防護功能」,包括控管跨範圍的資料輸出作業。
Service Directory 是服務註冊中心,用於儲存已註冊網路服務的相關資訊,包括名稱、位置和屬性。無論基礎架構為何,您都可以自動註冊服務並擷取詳細資料。這可讓您針對所有服務端點大規模探索、發布及連結服務。
虛擬私有雲網路可為虛擬機器 (VM) 執行個體提供連線,並讓您使用內部 IP 位址在虛擬私有雲網路中建立私人端點。透過私人網路傳送對虛擬私有雲網路資源的 HTTP 呼叫,同時強制執行 IAM 和 VPC Service Controls。
VPC Service Controls 是Google Cloud 功能,可讓您設定服務範圍並建立資料傳輸邊界。您可以搭配使用 Workflows 和 VPC Service Controls,協助保護服務,並降低資料外洩的風險。
本文件說明如何將 VPC 網路中的 VM 註冊為 Service Directory 端點。這樣一來,您就能為工作流程提供 Service Directory 服務名稱。工作流程執行作業會使用從服務註冊表擷取的資訊,傳送適當的 HTTP 要求,而不會傳送至公開網路。
下圖提供概略說明:
整體來說,您必須執行下列操作:
- 授予 Cloud Workflows 服務代理人權限,讓服務代理人可以查看 Service Directory 資源,並透過 Service Directory 存取 VPC 網路。
- 建立虛擬私有雲網路,提供網路功能。
- 建立 VPC 防火牆規則,以便允許或拒絕虛擬私有雲網路中 VM 執行個體的流量。
- 在 VPC 網路中建立 VM 執行個體。Compute Engine VM 執行個體是指託管在 Google 基礎架構上的虛擬機器。「Compute Engine 執行個體」、「VM 執行個體」和「VM」是同義詞,可互換使用。
- 在 VM 上部署應用程式。您可以在 VM 執行個體上執行應用程式,並確認流量是否如預期提供。
設定 Service Directory,讓工作流程執行作業能夠叫用 Service Directory 端點。
建立及部署工作流程。工作流程中的
private_service_name
值會指定您在上一個步驟中註冊的服務目錄端點。
授予 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
替換為您的 Google Cloud專案 ID。如要查看 Service Directory 資源,請將專案的 Service Directory Viewer 角色 (
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 存取 VPC 網路,請將專案的 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 執行個體的進出流量。
VPC 防火牆規則是在網路層級定義,並且僅會套用到規則建立時所在的網路。不過,您為規則選擇的名稱在專案內必須為專屬名稱。
舉例來說,下列指令會為先前建立的虛擬私有雲網路建立防火牆規則。
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 和服務目錄的路徑」。如果來源範圍包含
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
標記來定義目標;否則,規則會套用至網路中的所有目標。
詳情請參閱「使用 VPC 防火牆規則」。
在虛擬私有雲網路中建立 VM 執行個體
VM 執行個體包括 Google Kubernetes Engine (GKE) 叢集、App Engine 彈性環境執行個體,以及在 Compute Engine VM 上建構的其他 Google Cloud 產品。如要支援私人網路存取權,VPC 網路資源可以是 VM 執行個體、Cloud Interconnect IP 位址或第 4 層內部負載平衡器。
Compute Engine 執行個體可執行 Google 提供的 Linux 和 Windows Server 專屬公開映像檔,也可執行您建立或從現有系統匯入的私人自訂映像檔。您也可以部署 Docker 容器。
您可以使用一組預先定義的機器類型,或建立自訂機器類型,藉此選擇執行個體的機器屬性,例如虛擬 CPU 數量和記憶體數量。
舉例來說,下列指令會從公用映像檔建立 Linux VM 執行個體,其中網路介面會連結至您先前建立的虛擬私有雲網路。
建立及啟動 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 正在執行,請按一下
「Stop」停止 VM。如要編輯 VM,請按一下
「編輯」。在「Networking」>「Firewalls」區段中,如要允許 VM 接收 HTTP 或 HTTPS 流量,請選取「Allow HTTP traffic」或「Allow HTTPS traffic」。
在本例中,請勾選「Allow HTTP traffic」核取方塊。
Compute Engine 會在 VM 中新增網路標記,將防火牆規則與 VM 建立關聯。接著,建立對應的輸入防火牆規則,允許所有流量傳入
tcp:80
(HTTP) 或tcp:443
(HTTPS)。若要儲存變更,請按一下 [儲存]。
如要重新啟動 VM,請按一下「Start/Resume」(開始/繼續)。
詳情請參閱「建立並啟動 VM 執行個體」。
在 VM 上部署應用程式
如要測試網路設定,並確認流量是否如預期提供,您可以在 VM 上部署簡易應用程式,讓其監聽通訊埠。
舉例來說,下列指令會建立會監聽 3000 號埠的 Node.js Web 服務。
建立與 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" }
安裝 Express,這是 Node.js 的網路應用程式架構:
npm install express
為測試應用程式編寫程式碼:
vim app.js
以下範例會建立應用程式,以「Hello, world!」文字回應對根路徑 (
/
) 的所有GET
要求。請注意應用程式監聽的通訊埠。為 Service Directory 服務設定端點時,必須使用相同的連接埠號碼。
確認應用程式是否正在監聽通訊埠 3000:
node app.js
Compute Engine 提供多種部署選項。詳情請參閱「為工作負載選擇 Compute Engine 部署策略」。
設定 Service Directory
如要支援從工作流程執行作業叫用私人端點,您必須設定 Service Directory 命名空間、在命名空間中註冊服務,並在服務中新增端點。
舉例來說,下列指令會建立命名空間、服務和端點,指定 VM 執行個體的 VPC 網路和內部 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 位址。
詳情請參閱「設定 Service Directory」和「設定私人網路存取權」。
建立及部署工作流程
透過 Workflow 呼叫或叫用私人端點,可透過 HTTP 要求完成。最常見的 HTTP 要求方法都有呼叫快捷方式 (例如 http.get 和 http.post),但您可以將 call
欄位設為 http.request
,並使用 method
欄位指定要求類型,藉此發出任何類型的 HTTP 要求。詳情請參閱「提出 HTTP 要求」。
建立工作流程的原始碼檔案:
touch call-private-endpoint.JSON_OR_YAML
視工作流程的格式而定,將
JSON_OR_YAML
替換為yaml
或json
。在文字編輯器中,將下列工作流程 (在本例中,為
url
值使用 HTTP 通訊協定) 複製到原始碼檔案: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
值必須是指定已註冊服務目錄服務名稱的字串,格式如下: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[email protected]
執行工作流程:
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。
- 使用 VPC Service Controls 設定服務範圍。
- 啟用 IAP 以叫用私人內部端、Compute Engine、GKE 或其他端點。