叫用符合 VPC Service Controls 規範的私人端點

您可以使用 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 要求,而不會傳送至公開網路。

下圖提供概略說明:

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

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

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

  7. 建立及部署工作流程。工作流程中的 private_service_name 值會指定您在上一個步驟中註冊的服務目錄端點。

授予 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 替換為您的 Google Cloud專案 ID。

  2. 如要查看 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)'
  3. 如要使用 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 執行個體,其中網路介面會連結至您先前建立的虛擬私有雲網路。

  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 正在執行,請按一下 「Stop」停止 VM。

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

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

    在本例中,請勾選「Allow HTTP traffic」核取方塊。

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

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

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

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

在 VM 上部署應用程式

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

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

  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. 安裝 Express,這是 Node.js 的網路應用程式架構:

    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.');
    });

    請注意應用程式監聽的通訊埠。為 Service Directory 服務設定端點時,必須使用相同的連接埠號碼。

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

    node app.js

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

設定 Service Directory

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

舉例來說,下列指令會建立命名空間、服務和端點,指定 VM 執行個體的 VPC 網路和內部 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 位址。

詳情請參閱「設定 Service Directory」和「設定私人網路存取權」。

建立及部署工作流程

透過 Workflow 呼叫或叫用私人端點,可透過 HTTP 要求完成。最常見的 HTTP 要求方法都有呼叫快捷方式 (例如 http.gethttp.post),但您可以將 call 欄位設為 http.request,並使用 method 欄位指定要求類型,藉此發出任何類型的 HTTP 要求。詳情請參閱「提出 HTTP 要求」。

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

    touch call-private-endpoint.JSON_OR_YAML

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

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

  3. 部署工作流程。為了測試,您可以將 Compute Engine 預設服務帳戶附加至工作流程,以代表其身分:

    gcloud workflows deploy call-private-endpoint \
        --source=call-private-endpoint.JSON_OR_YAML \
        --location=REGION \
        --service-account=PROJECT_NUMBER[email protected]
  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

後續步驟