使用 Service Directory 的服務登錄檔叫用私人端點

您可以透過 Workflows 使用 Service Directory 的服務登錄,從工作流程執行作業指定 HTTP 呼叫的私人端點。這樣一來,您就能為工作流程提供 Service Directory 服務名稱。工作流程執行作業會使用從服務登錄檔擷取的資訊,傳送適當的 HTTP 要求,而不會傳出至公用網路。

本文說明如何將虛擬私有雲 (VPC) 網路中的虛擬機器 (VM) 註冊為服務目錄端點:

  • 虛擬私有雲網路可為 VM 執行個體提供連線,並讓您使用內部 IP 位址,在虛擬私有雲網路中建立私人端點。系統會透過私人網路將對虛擬私有雲網路資源的 HTTP 呼叫傳送至該資源,同時強制執行 Identity and Access Management (IAM) 和 VPC Service Controls。

  • Service Directory服務登錄,可儲存已註冊網路服務的相關資訊,包括名稱、位置和屬性。無論基礎架構為何,您都可以自動註冊服務並擷取詳細資料。這項功能可讓您大規模探索、發布及連結所有服務端點的服務。

下圖提供概要總覽:

使用服務目錄中的資訊,將 HTTP 要求傳送至 VM 執行個體上的連接埠號碼

整體來說,您必須執行下列操作:

  1. 授予 Cloud Workflows 服務代理人權限,以便服務代理人查看 Service Directory 資源,並使用 Service Directory 存取虛擬私有雲網路。
  2. 建立虛擬私有雲網路,提供網路功能。
  3. 建立虛擬私有雲防火牆規則,允許或拒絕虛擬私有雲網路中 VM 執行個體的往來流量。
  4. 在 VPC 網路中建立 VM 執行個體。Compute Engine VM 執行個體是指託管在 Google 基礎架構上的虛擬機器。「Compute Engine 執行個體」、「VM 執行個體」和「VM」這幾個詞是同義詞,可以互換使用。
  5. 在 VM 上部署應用程式。您可以在 VM 執行個體上執行應用程式,並確認流量是否正常提供。
  6. 設定 Service Directory,讓工作流程執行作業可以叫用 Service Directory 端點。

  7. 建立及部署工作流程。工作流程中的 private_service_name 值會指定您在上一步註冊的 Service Directory 端點。

將權限授予 Cloud Workflows 服務代理人

部分 Google Cloud 服務有服務代理,可讓服務存取您的資源。如果 API 需要服務代理人,Google 會在您啟用及使用 API 後建立服務代理人。

  1. 首次部署工作流程時,系統會自動建立 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

  2. 如要查看 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)'
  3. 如要使用 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 網路。

  1. 建立並啟動 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 的名稱。

  2. 如果系統提示您確認執行個體的可用區,請輸入 y

    建立 VM 執行個體後,請記下傳回的 INTERNAL_IP 位址。

  3. 前往 Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面

    前往 VM 執行個體

  4. 在「Name」(名稱) 欄中,按一下適當的 VM 執行個體名稱。

  5. 如果 VM 正在執行,請按一下「停止」停止 VM。

  6. 如要編輯 VM,請按一下 「編輯」

  7. 在「Networking」(網路) >「Firewalls」(防火牆) 區段中,如要允許 VM 接收 HTTP 或 HTTPS 流量,請選取「Allow HTTP traffic」(允許 HTTP 流量) 或「Allow HTTPS traffic」(允許 HTTPS 流量)

    以這個範例來說,請勾選「允許 HTTP 流量」核取方塊。

    Compute Engine 會在 VM 中新增網路標記,將防火牆規則與 VM 建立關聯。然後建立對應的輸入防火牆規則,允許所有流量傳入 tcp:80 (HTTP) 或 tcp:443 (HTTPS)。

  8. 若要儲存變更,請按一下 [儲存]

  9. 如要重新啟動 VM,請按一下「Start/Resume」(開始/繼續)

詳情請參閱「建立及啟動 VM 執行個體」。

在 VM 上部署應用程式

如要測試網路設定,並確認流量是否如預期提供服務,您可以在 VM 上部署監聽通訊埠的基本應用程式。

舉例來說,下列指令會建立 Node.js Web 服務,並監聽 3000 埠。

  1. 建立與 VM 執行個體的 SSH 連線

  2. 更新套件存放區:

    sudo apt update
  3. 安裝 NVMNode.jsnpm

    詳情請參閱設定 Node.js 開發環境一文。

  4. 以互動方式建立 package.json 檔案:

    npm init

    例如:

    {
    "name": "test",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "hello"
    },
    "author": "",
    "license": "ISC"
    }
  5. 安裝 Node.js 的網路應用程式架構 Express

    npm install express
  6. 編寫測試應用程式的程式碼:

    vim app.js

    下列範例會建立應用程式,以「Hello, world!」文字回應對根路徑 (/) 的 GET 要求。

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      res.status(200).send('Hello, world!').end();
    });
    
    app.listen(3000, () => {
      console.log('Sample app listening on port 3000.');
    });

    請記下應用程式監聽的通訊埠。為服務目錄服務設定端點時,必須使用相同的連接埠號碼。

  7. 確認應用程式正在監聽通訊埠 3000:

    node app.js

Compute Engine 提供多種部署選項。詳情請參閱為工作負載選擇 Compute Engine 部署策略

設定 Service Directory

如要支援從工作流程執行作業叫用私有端點,您必須設定 Service Directory 命名空間、在命名空間中註冊服務,並將端點新增至服務。

舉例來說,下列指令會建立命名空間、服務和端點,指定 VM 執行個體的虛擬私有雲網路和內部 IP 位址。

  1. 建立命名空間:

    gcloud service-directory namespaces create NAMESPACE \
        --location=REGION

    更改下列內容:

    • NAMESPACE:命名空間的 ID 或命名空間的完整 ID。
    • REGION:包含命名空間的 Google Cloud 區域,例如 us-central1
  2. 建立服務:

    gcloud service-directory services create SERVICE \
        --namespace=NAMESPACE \
        --location=REGION

    SERVICE 替換為您要建立的服務名稱。

  3. 設定端點。

    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.gethttp.post),但您可以將 call 欄位設為 http.request,並使用 method 欄位指定要求類型,發出任何類型的 HTTP 要求。詳情請參閱「提出 HTTP 要求」。

  1. 為工作流程建立原始碼檔案:

    touch call-private-endpoint.JSON_OR_YAML

    視工作流程的格式而定,請將 JSON_OR_YAML 替換為 yamljson

  2. 在文字編輯器中,將下列工作流程 (在本例中,工作流程會使用 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

  3. 部署工作流程。為進行測試,您可以將 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
  4. 執行工作流程:

    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

後續步驟