您可以使用 Cloud Build 私人集區,將 Cloud Build 連線至 Secure Source Manager Private Service Connect 執行個體。
事前準備
- 建立 Private Service Connect Secure Source Manager 執行個體。
- 如果您先前已為 Private Service Connect 執行個體設定端點,則必須取消連結。如要釋放端點,請按照「釋放靜態內部 IPv4 或 IPv6 位址」一文的說明操作。
-
Enable the Cloud Build, Service Networking, and Compute Engine APIs.
必要的角色
如要取得將 Cloud Build 連線至 Private Service Connect Secure Source Manager 執行個體所需的權限,請管理員授予您機構的存取權內容管理員角色 (roles/accesscontextmanager.policyAdmin
) IAM 角色。
設定服務帳戶
如要在 Cloud Build 中遵循最低權限原則,您可以設定 Cloud Build 使用具備足夠權限的服務帳戶來執行建構作業。
如未指定服務帳戶,Cloud Build 可能會自動選取服務帳戶,代表您執行建構作業。這個服務帳戶可能具備不必要的廣泛權限,例如存取 Secure Source Manager 執行個體和專案中的任何存放區。
如果您還沒有想使用的服務帳戶,請建立服務帳戶。
-
前往 Google Cloud 控制台的 settings Secure Source Manager「Permissions」(權限) 頁面:
在「服務帳戶權限」分頁中,選取要做為 Cloud Build 服務帳戶的服務帳戶。
您可以選取「設為偏好的服務帳戶」,在建立新的觸發條件時預先填入服務帳戶。
授予服務帳戶必要權限
根據您的用途,將必要的 Cloud Build 角色授予服務帳戶。如要瞭解不同 Cloud Build 動作所需的 Cloud Build 角色,請參閱「設定 Cloud Build 的存取權」。
如要授予服務帳戶擷取 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 服務帳戶的服務帳戶電子郵件地址。
如要授予服務帳戶存取 Secure Source Manager 執行個體的權限,請執行下列指令。
gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \ --member=serviceAccount:SA_EMAIL \ --role=roles/securesourcemanager.instanceAccessor \ --condition=None
如要授予服務帳戶從 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) 網路
預留要用於對等互連 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。
如要建立與
servicenetworking.googleapis.com
的 VPC 對等互連,請執行下列指令。gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=CB_PEER_RANGE \ --network=NETWORK \ --project=INSTANCE_PROJECT_ID
如要建立對等互連的 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 區域。
如要將網路路徑匯出至 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
如要在與 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_-]+
。如要為 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 端點值。
如要為 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)。如要進一步瞭解如何透過端點存取已發布的服務,請參閱「透過端點存取已發布服務的相關說明」。
如要為 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 子網路」。
如要為 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 名稱。如要為 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 的後端
如要註冊 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
如要註冊 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
如要為 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 名稱。如要為 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
如要建立轉送規則,將流量轉送至 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
是您要建立的轉送規則名稱。如要建立轉送規則,將流量轉送至 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 記錄。
如要取得 HTTP 轉送規則的 IP 位址,請執行下列指令。
gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION
其中
HTTP_PROXY_FORWARD
是您為 HTTP 轉送規則指定的名稱。如要註冊 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
的輸出內容。
如要註冊 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
如要註冊網頁介面的 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
如要取得 SSH 轉送規則的 IP 位址,請執行下列指令。
gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \ --project=INSTANCE_PROJECT_ID \ --region=INSTANCE_LOCATION
其中
SSH_PROXY_FORWARD
是您為 SSH 轉送規則指定的名稱。如要註冊 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_IP
是gcloud compute forwarding-rules describe SSH_PROXY_FORWARD
的輸出內容。
在執行個體中建立存放區
您可以使用防禦主機,在 Private Service Connect 執行個體中存取及建立存放區。
執行下列指令來建立存放區。
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 CloudINSTANCE_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
後續步驟
- 如要自動建構 Secure Source Manager,請按照「建立觸發條件檔案」中的操作說明進行。