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 アドレスの範囲です。サブネット マスクの長さは 26 以下にして、リージョン内のプロキシで 64 個以上の IP アドレスを使用できるようにします。推奨されるサブネット マスクの長さは /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: Secure Source Manager インスタンスの名前。
    • PROJECT_NUMBER: インスタンスの Google Cloud プロジェクト番号。
    • INSTANCE_LOCATION: インスタンスのロケーション。
    • REPOSITORY_ID: リポジトリに付ける名前。

    リポジトリが Private Service Connect インスタンスに作成されます。

Cloud Build から Secure Source Manager へのアクセスをテストする

すべてが正しく機能していることを確認するには、次のビルド構成ファイルを使用して、接続をテストし、Secure Source Manager からソースコードを pull します。ビルド構成ファイルは、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

次のステップ