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

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

或者,您也可以搭配使用 Secure Source Manager 和 Developer Connect 來執行這項操作。詳情請參閱「Developer 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.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    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 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 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

後續步驟