將 Cloud Build 連線至 Private Service Connect 執行個體

您可以使用 Cloud Build 私人集區,將 Cloud Build 連線至 Secure Source Manager Private Service Connect 執行個體。

事前準備

  1. 建立 Private Service Connect Secure Source Manager 執行個體
  2. 如果您先前已為 Private Service Connect 執行個體設定端點,則必須取消連結。如要釋放端點,請按照「釋放靜態內部 IPv4 或 IPv6 位址」一文的說明操作。
  3. Enable the Cloud Build, Service Networking, and Compute Engine APIs.

    Enable the APIs

必要的角色

如要取得將 Cloud Build 連線至 Private Service Connect Secure Source Manager 執行個體所需的權限,請管理員授予您機構的存取權內容管理員角色 (roles/accesscontextmanager.policyAdmin) IAM 角色。

設定服務帳戶

如要在 Cloud Build 中遵循最低權限原則,您可以設定 Cloud Build 使用具備足夠權限的服務帳戶來執行建構作業。

如未指定服務帳戶,Cloud Build 可能會自動選取服務帳戶,代表您執行建構作業。這個服務帳戶可能具備不必要的廣泛權限,例如存取 Secure Source Manager 執行個體和專案中的任何存放區。

  1. 如果您還沒有想使用的服務帳戶,請建立服務帳戶

  2. 前往 Google Cloud 控制台的 Secure Source Manager「Permissions」(權限) 頁面

    前往「權限」

  3. 在「服務帳戶權限」分頁中,選取要做為 Cloud Build 服務帳戶的服務帳戶。

  4. 您可以選取「設為偏好的服務帳戶」,在建立新的觸發條件時預先填入服務帳戶。

授予服務帳戶必要權限

  1. 根據您的用途,將必要的 Cloud Build 角色授予服務帳戶。如要瞭解不同 Cloud Build 動作所需的 Cloud Build 角色,請參閱「設定 Cloud Build 的存取權」。

  2. 如要授予服務帳戶擷取 CA 憑證的權限,請執行下列指令。

    gcloud projects add-iam-policy-binding CA_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/privateca.auditor \
      --condition=None
    

    更改下列內容:

    • CA_PROJECT_ID:CA 集區專案的專案 ID。
    • SA_EMAIL:使用您設為 Cloud Build 服務帳戶的服務帳戶電子郵件地址。
  3. 如要授予服務帳戶存取 Secure Source Manager 執行個體的權限,請執行下列指令。

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.instanceAccessor \
      --condition=None
    
  4. 如要授予服務帳戶從 Secure Source Manager 存放區讀取的權限,請執行下列指令。

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.repoReader \
      --condition=None
    

設定建構作業記錄檔

為建構作業指定自己的服務帳戶時,您必須將建構記錄儲存在 Cloud Logging 或使用者建立的 Cloud Storage bucket 中。您無法將記錄檔儲存在預設記錄檔 bucket 中。

如要在 Cloud Logging 中儲存建構記錄,請將記錄寫入者 (roles/logging.logWriter) 角色授予 Cloud Build 服務帳戶。

如要進一步瞭解如何設定建構記錄,請參閱「設定使用者指定的服務帳戶」。

建立 Cloud DNS 私人區域

如要建立代管的 Cloud DNS 私人區域,請執行下列指令。

gcloud dns managed-zones create ZONE_NAME \
    --project=PROJECT_ID \
    --description=DESCRIPTION \
    --dns-name="INSTANCE_LOCATION.p.sourcemanager.dev." \
    --visibility="private" \
    --networks="https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK"

更改下列內容:

  • ZONE_NAME:您要授予受管理區域的名稱。
  • PROJECT_ID:您要用於 Cloud DNS 區域的 Google Cloud 專案 ID。
  • DESCRIPTION:並提供該區域的說明。
  • INSTANCE_LOCATION:您要建立 Secure Source Manager 執行個體的位置。

如要進一步瞭解 Cloud DNS 代管不公開區域,請參閱 Cloud DNS 總覽

設定虛擬私有雲 (VPC) 網路

  1. 預留要用於對等互連 Secure Source Manager VPC 與 Cloud Build 私人集區的 IP 範圍。

     gcloud compute addresses create CB_PEER_RANGE \
      --global \
      --purpose=VPC_PEERING \
      --prefix-length=24 \
      --description="IP range for peering with Cloud Build private pool" \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    

    更改下列內容:

    • CB_PEER_RANGE:要建立的地址名稱。
    • NETWORK:網路資源,應在其中保留位址。如果您使用預設網路,值為 default
    • INSTANCE_PROJECT_ID:使用 Private Service Connect 執行個體專案 ID。
  2. 如要建立與 servicenetworking.googleapis.com 的 VPC 對等互連,請執行下列指令。

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=CB_PEER_RANGE \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    
  3. 如要建立對等互連的 DNS 網域,以便與 Cloud Build 連線,請執行下列指令。

    gcloud services peered-dns-domains create DNS_PEERING_DOMAIN \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID \
      --dns-suffix=INSTANCE_LOCATION.p.sourcemanager.dev.
    

    更改下列內容:

    • DNS_PEERING_DOMAIN:您要建立的對等互連 DNS 網域名稱。

    您必須明確共用私人 DNS 區域。如要進一步瞭解如何共用私人 DNS 區域,請參閱與服務生產者共用私人 DNS 區域

  4. 如要將網路路徑匯出至 Cloud Build,請執行下列指令。

    gcloud compute networks peerings update servicenetworking-googleapis-com \
      --network=NETWORK \
      --export-custom-routes \
      --no-export-subnet-routes-with-public-ip \
      --project=INSTANCE_PROJECT_ID
    
  5. 如要在與 Private Service Connect 執行個體相同的 Google Cloud專案中建立 Cloud Build 私人集區,請執行下列指令。

    gcloud builds worker-pools create PRIVATE_POOL_ID \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --peered-network=projects/INSTANCE_PROJECT_ID/global/networks/NETWORK \
      --worker-disk-size=100 \
      --no-public-egress
    

    其中 PRIVATE_POOL_ID 是您要建立的私有集區名稱。名稱長度必須介於 1 至 63 個字元之間,且只能使用 [a-zA-Z0-9_-]+

  6. 如要為 HTTP 端點建立 Private Service Connect 網路端點群組 (NEG),請執行下列指令:

    gcloud beta compute network-endpoint-groups create HTTP_NEG_NAME \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
        --psc-target-service=HTTP_PSC \
        --network=NETWORK --subnet=SUBNET
    

    其中:

    • HTTP_NEG_NAME 是要為 HTTP 端點建立的 NEG 名稱。
    • HTTP_PSC 是 HTTP Private Service Connect 端點值。
  7. 如要為 SSH 端點建立 Private Service Connect NEG,請執行下列指令:

    gcloud beta compute network-endpoint-groups create SSH_NEG_NAME \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --network-endpoint-type=PRIVATE_SERVICE_CONNECT \
      --psc-target-service=SSH_PSC \
      --network=NETWORK --subnet=SUBNET
    

    其中:

    • SSH_NEG_NAME 是您要為 SSH 端點建立的 NEG 名稱。
    • SSH_PSC 是 SSH Private Service Connect 端點值。

設定 Proxy 內部負載平衡器 (ILB)

無法從對等互連的虛擬私有雲網路存取端點。如要存取 Secure Source Manager 端點,您必須為每個端點設定 L4 內部負載平衡器 (ILB)。如要進一步瞭解如何透過端點存取已發布的服務,請參閱「透過端點存取已發布服務的相關說明」。

  1. 如要為 ILB 建立僅限 Proxy 的子網路,請執行下列指令。

    gcloud compute networks subnets create ILB_PROXY_SUBNET_NAME \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=INSTANCE_LOCATION \
    --network=NETWORK \
    --range=CIDR_RANGE \
    --project=INSTANCE_PROJECT_ID
    

    其中:

    • ILB_PROXY_SUBNET_NAME 是要建立的子網路名稱。
    • CIDR_RANGE 是子網路的主要 IP 位址範圍。您必須使用長度不超過 26 的子網路遮罩,使該地區的 Proxy 至少有 64 個 IP 位址可用。建議的子網路遮罩長度為 /23。如要進一步瞭解僅限 Proxy 的子網路,請參閱「Envoy 負載平衡器的僅限 Proxy 子網路」。
  2. 如要為 HTTP 連線 NEG 建立 L4 ILB,請執行下列指令。

    gcloud compute backend-services create HTTP_PROXY_ILB \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --load-balancing-scheme=INTERNAL_MANAGED
    

    其中 HTTP_PROXY_ILB 是要為 HTTP 端點建立的 ILB 名稱。

  3. 如要為 SSH 連線 NEG 建立 L4 ILB,請執行下列指令。

    gcloud compute backend-services create SSH_PROXY_ILB \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --load-balancing-scheme=INTERNAL_MANAGED
    

    其中 SSH_PROXY_ILB 是要為 SSH 端點建立的 ILB 名稱。

將 Private Service Connect NEG 註冊為 ILB 的後端

  1. 如要註冊 HTTP NEG,請執行下列指令。

    gcloud compute backend-services add-backend HTTP_PROXY_ILB \
      --network-endpoint-group=HTTP_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    
  2. 如要註冊 SSH NEG,請執行下列指令。

    gcloud compute backend-services add-backend SSH_PROXY_ILB \
      --network-endpoint-group=SSH_NEG_NAME \
      --network-endpoint-group-region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

為 ILB 建立目標 TCP Proxy

  1. 如要為 HTTP ILB 建立目標 TCP Proxy,請執行下列指令。

    gcloud compute target-tcp-proxies create ILB_HTTP_TCP_TARGET_PROXY \
      --backend-service=HTTP_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    其中 ILB_HTTP_TCP_TARGET_PROXY 是要為 HTTP ILB 建立的目標 TCP Proxy 名稱。

  2. 如要為 SSH ILB 建立目標 TCP Proxy,請執行下列指令。

    gcloud compute target-tcp-proxies create ILB_SSH_TCP_TARGET_PROXY \
      --backend-service=SSH_PROXY_ILB \
      --region=INSTANCE_LOCATION \
      --project=INSTANCE_PROJECT_ID
    

    其中 ILB_SSH_TP_TARGET_PROXY 是您為 SSH ILB 建立的目標 TCP Proxy 名稱。

建立轉送規則,將流量導向 ILB

  1. 如要建立轉送規則,將流量轉送至 HTTP ILB,請執行下列指令。

    gcloud compute forwarding-rules create HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 443 \
        --target-tcp-proxy=ILB_HTTP_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    其中 HTTP_PROXY_FORWARD 是您要建立的轉送規則名稱。

  2. 如要建立轉送規則,將流量轉送至 SSH ILB,請執行下列指令。

    gcloud compute forwarding-rules create SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --ports 22 \
        --target-tcp-proxy=ILB_SSH_TCP_TARGET_PROXY \
        --target-tcp-proxy-region=INSTANCE_LOCATION \
        --network-tier PREMIUM \
        --load-balancing-scheme=INTERNAL_MANAGED \
        --network=NETWORK \
        --subnet=SUBNET \
        --subnet-region=INSTANCE_LOCATION
    

    其中 SSH_PROXY_FORWARD 是您要建立的轉送規則名稱。

建立私人 DNS 記錄

設定轉送規則後,您必須在每個執行個體主機名稱的私有 Cloud DNS 區域中註冊 DNS 記錄。

  1. 如要取得 HTTP 轉送規則的 IP 位址,請執行下列指令。

    gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    其中 HTTP_PROXY_FORWARD 是您為 HTTP 轉送規則指定的名稱。

  2. 如要註冊 API 主機名稱,請執行下列指令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    

    更改下列內容:

    • INSTANCE_ID:您的執行個體 ID。
    • INSTANCE_PROJECT_NUMBER:您的執行個體 Google Cloud專案編號。
    • INSTANCE_LOCATION:執行個體所在的區域。
    • INSTANCE_PROJECT_ID:執行個體的 Google Cloud專案 ID。
    • ZONE_NAME:您為受管理區域指定的名稱。
    • HTTP_LB_IP:是 gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD 的輸出內容。
  3. 如要註冊 Git HTTP 主機名稱,請執行下列指令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=HTTP_LB_IP
    
  4. 如要註冊網頁介面的 HTML 主機名稱,請執行下列指令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER.INSTANCE_LOCATION.p.sourcemanager.dev.\
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
      --rrdatas=HTTP_LB_IP
    
  5. 如要取得 SSH 轉送規則的 IP 位址,請執行下列指令。

    gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    其中 SSH_PROXY_FORWARD 是您為 SSH 轉送規則指定的名稱。

  6. 如要註冊 Git SSH 主機名稱,請執行下列指令。

    gcloud dns record-sets create INSTANCE_ID-INSTANCE_PROJECT_NUMBER-ssh.INSTANCE_LOCATION.p.sourcemanager.dev. \
        --project=INSTANCE_PROJECT_ID \
        --zone=ZONE_NAME \
        --type=A \
        --ttl=300 \
        --rrdatas=SSH_LB_IP
    

    其中 SSH_LB_IPgcloud compute forwarding-rules describe SSH_PROXY_FORWARD 的輸出內容。

在執行個體中建立存放區

您可以使用防禦主機,在 Private Service Connect 執行個體中存取及建立存放區。

  1. 按照「建立防禦主機 VM」一文中的操作說明,使用 cloud-platform scope 建立防禦主機 VM。

  2. 執行下列指令來建立存放區。

    curl \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://INSTANCE_ID-PROJECT_NUMBER-api.INSTANCE_LOCATION.p.sourcemanager.dev/v1/projects/PROJECT_NUMBER/locations/INSTANCE_LOCATION/repositories?repository_id=REPOSITORY_ID \
    -d '{}'
    

    更改下列內容:

    • INSTANCE_ID:Secure Source Manager 執行個體的名稱。
    • PROJECT_NUMBER:使用執行個體的 Google Cloud 專案編號。
    • INSTANCE_LOCATION:執行個體的位置。
    • REPOSITORY_ID:您要授予存放區的名稱。

    系統會在 Private Service Connect 執行個體中建立存放區。

從 Cloud Build 測試 Secure Source Manager 的存取權

如要確認一切正常運作,可以使用下列建構設定檔測試連線,並從 Secure Source Manager 提取原始碼。建構設定檔會假設您使用 Cloud Logging 儲存建構記錄。如果您使用使用者建立的 Cloud Storage bucket,請參閱「使用設定檔執行建構作業」,瞭解如何編輯建構設定檔。

使用下列 YAML 檔案前,請先替換以下項目:

  • CA_POOL_NAME:建立 Private Service Connect 執行個體時使用的 CA 集區名稱。
  • CA_PROJECT_ID:您用來建立 CA 集區的專案。 Google Cloud
  • INSTANCE_LOCATION:執行個體的位置。
  • INSTANCE_ID 改為執行個體名稱。
  • INSTANCE_PROJECT_NUMBER:使用執行個體的 Google Cloud 專案編號。
  • REPOSITORY_ID:您為存放區指定的名稱。
  • SA_PROJECT_ID:使用 Cloud Build 時所用服務帳戶的專案 ID。
  • SERVICE_ACCOUNT:使用您透過 Cloud Build 服務帳戶使用的電子郵件地址。
steps:
  - name: gcr.io/cloud-builders/gcloud
    args:
      - privateca
      - pools
      - get-ca-certs
      - CA_POOL_NAME
      - '--project'
      - CA_PROJECT_ID
      - '--location'
      - INSTANCE_LOCATION
      - '--output-file=cacert.pem'
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - 'credential.https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev.helper'
      - gcloud.sh
  - name: gcr.io/cloud-builders/git
    args:
      - config
      - '--global'
      - http.sslCAInfo
      - cacert.pem
  - name: gcr.io/cloud-builders/git
    env:
      - GIT_TRACE=1
      - GIT_CURL_VERBOSE=1
    args:
      - clone
      - >-
        https://INSTANCE_ID-INSTANCE_PROJECT_NUMBER-git.INSTANCE_LOCATION.p.sourcemanager.dev/INSTANCE_PROJECT_ID/REPOSITORY_ID
      - https-clone
serviceAccount: 'projects/SA_PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
options:
  logging: CLOUD_LOGGING_ONLY

後續步驟