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 인스턴스에 연결하는 데 필요한 권한을 얻으려면 관리자에게 조직에 대한 Access Context Manager 관리자 역할 (roles/accesscontextmanager.policyAdmin) IAM 역할을 부여해 달라고 요청하세요.

서비스 계정 구성

Cloud Build에서 최소 권한의 원칙을 따르려면 Cloud Build에서 빌드를 실행하는 데 충분한 권한이 있는 서비스 계정을 사용하도록 구성하면 됩니다.

서비스 계정을 지정하지 않으면 Cloud Build에서 자동으로 서비스 계정을 선택하여 빌드를 대신 실행할 수 있습니다. 이 서비스 계정에는 Secure Source Manager 인스턴스 및 프로젝트의 저장소에 대한 액세스 권한과 같이 사용 사례에 불필요한 권한이 다양하게 있을 수 있습니다.

  1. 사용하려는 서비스 계정이 아직 없는 경우 서비스 계정을 만듭니다.

  2. Google Cloud 콘솔에서 Secure Source Manager 권한 페이지로 이동합니다.

    권한으로 이동

  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 버킷에 저장해야 합니다. 기본 로그 버킷에는 로그를 저장할 수 없습니다.

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) 네트워크 구성

  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. 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 영역 공유를 참고하세요.

  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 엔드포인트 값입니다.

프록시 내부 부하 분산기 (ILB) 설정

피어링된 VPC 네트워크에서 엔드포인트에 액세스할 수 없습니다. Secure Source Manager 엔드포인트에 액세스하려면 각 엔드포인트에 대해 L4 내부 부하 분산기 (ILB)를 설정해야 합니다. 엔드포인트를 통해 게시된 서비스에 액세스하는 방법에 관한 자세한 내용은 엔드포인트를 통해 게시된 서비스 액세스 정보를 참고하세요.

  1. 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 기반 부하 분산기용 프록시 전용 서브넷을 참고하세요.
  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 프록시 만들기

  1. 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 프록시의 이름입니다.

  2. 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로 라우팅하는 전달 규칙 만들기

  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 범위로 배스천 호스트 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: 보안 소스 관리자 인스턴스의 이름입니다.
    • 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

다음 단계