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 인스턴스에 연결하는 데 필요한 권한을 얻으려면 관리자에게 조직에 대한 Access Context Manager 관리자 역할 (roles/accesscontextmanager.policyAdmin
) IAM 역할을 부여해 달라고 요청하세요.
서비스 계정 구성
Cloud Build에서 최소 권한의 원칙을 따르려면 Cloud Build에서 빌드를 실행하는 데 충분한 권한이 있는 서비스 계정을 사용하도록 구성하면 됩니다.
서비스 계정을 지정하지 않으면 Cloud Build에서 자동으로 서비스 계정을 선택하여 빌드를 대신 실행할 수 있습니다. 이 서비스 계정에는 Secure Source Manager 인스턴스 및 프로젝트의 저장소에 대한 액세스 권한과 같이 사용 사례에 불필요한 권한이 다양하게 있을 수 있습니다.
사용하려는 서비스 계정이 아직 없는 경우 서비스 계정을 만듭니다.
-
Google Cloud 콘솔에서 settings Secure Source Manager 권한 페이지로 이동합니다.
서비스 계정 권한 탭에서 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 풀 프로젝트의 프로젝트 IDSA_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 버킷에 저장해야 합니다. 기본 로그 버킷에는 로그를 저장할 수 없습니다.
Cloud Logging에 빌드 로그를 저장하려면 Cloud Build 서비스 계정에 로그 작성자 (roles/logging.logWriter
) 역할을 부여합니다.
빌드 로그를 설정하는 방법에 대한 자세한 내용은 사용자 지정 서비스 계정 구성을 참고하세요.
비공개 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 개요를 참고하세요.
Virtual Private Cloud (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
Cloud Build에 연결하기 위해 피어링된 DNS 도메인을 만들려면 다음 명령어를 실행합니다.
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 엔드포인트 값입니다.
프록시 내부 부하 분산기 (ILB) 설정
피어링된 VPC 네트워크에서 엔드포인트에 액세스할 수 없습니다. Secure Source Manager 엔드포인트에 액세스하려면 각 엔드포인트에 대해 L4 내부 부하 분산기 (ILB)를 설정해야 합니다. 엔드포인트를 통해 게시된 서비스에 액세스하는 방법에 관한 자세한 내용은 엔드포인트를 통해 게시된 서비스 액세스 정보를 참고하세요.
ILB용 프록시 전용 서브넷을 만들려면 다음 명령어를 실행합니다.
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 주소 범위입니다. 리전의 프록시에서 64개 이상의 IP 주소를 사용할 수 있도록26
이하의 서브넷 마스크를 사용해야 합니다. 권장 서브넷 마스크 길이는/23
입니다. 프록시 전용 서브넷에 대한 자세한 내용은 Envoy 기반 부하 분산기용 프록시 전용 서브넷을 참고하세요.
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 프록시 만들기
HTTP ILB의 대상 TCP 프록시를 만들려면 다음 명령어를 실행합니다.
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 프록시의 이름입니다.SSH ILB의 대상 TCP 프록시를 만들려면 다음 명령어를 실행합니다.
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 프록시의 이름입니다.
트래픽을 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 인스턴스에서 저장소에 액세스하고 저장소를 만들 수 있습니다.
배스천 호스트 VM 만들기의 안내에 따라
cloud-platform
범위로 배스천 호스트 VM을 만듭니다.다음 명령어를 실행하여 저장소를 만듭니다.
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
: 보안 소스 관리자 인스턴스의 이름입니다.PROJECT_NUMBER
: 인스턴스의 Google Cloud 프로젝트 번호로 바꿉니다.INSTANCE_LOCATION
: 인스턴스의 위치REPOSITORY_ID
을 저장소에 지정할 이름으로 바꿉니다.
Private Service Connect 인스턴스에 저장소가 생성됩니다.
Cloud Build에서 Secure Source Manager에 대한 액세스 테스트
모든 항목이 올바르게 작동하는지 확인하려면 다음 빌드 구성 파일을 사용하여 연결을 테스트하고 Secure Source Manager에서 소스 코드를 가져오면 됩니다. 빌드 구성 파일은 Cloud Logging을 사용하여 빌드 로그를 저장한다고 가정합니다. 사용자가 만든 Cloud Storage 버킷을 사용하는 경우 빌드 구성 파일을 수정하는 방법은 구성 파일을 사용하여 빌드 실행을 참고하세요.
다음 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
다음 단계
- Secure Source Manager에서 빌드를 자동화하려면 트리거 파일 만들기의 안내를 따르세요.