Connecter Cloud Build à une instance Private Service Connect

Vous pouvez connecter Cloud Build à une instance Secure Source Manager Private Service Connect à l'aide de pools privés Cloud Build. Cette connexion est une alternative plus complexe à l'utilisation de Developer Connect. Utilisez l'approche décrite dans ce guide si vous ne souhaitez pas exposer un point de terminaison de proxy Git.

Avant de commencer

  1. Créez une instance Secure Source Manager Private Service Connect.
  2. Si vous avez déjà configuré les points de terminaison de votre instance Private Service Connect, vous devez les déconnecter. Pour libérer vos points de terminaison, suivez les instructions de la section Libérer une adresse IPv4 ou IPv6 interne statique.
  3. Activez les API Cloud Build, Service Networking et Compute Engine.

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin de l'autorisation serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation via le rôle Propriétaire (roles/owner). Sinon, vous pouvez l'obtenir via le rôle Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer les API

Rôles requis

Pour obtenir les autorisations nécessaires pour connecter Cloud Build à une instance Secure Source Manager Private Service Connect, demandez à votre administrateur de vous accorder le rôle IAM Administrateur Access Context Manager (roles/accesscontextmanager.policyAdmin) sur l'organisation.

Configurer votre compte de service

Pour suivre le principe du moindre privilège dans Cloud Build, vous pouvez configurer Cloud Build pour qu'il utilise un compte de service disposant de juste assez de privilèges pour exécuter une compilation.

Si vous ne spécifiez pas de compte de service, Cloud Build peut en sélectionner automatiquement un pour exécuter des compilations en votre nom. Ce compte de service peut disposer d'autorisations inutilement larges pour votre cas d'utilisation, comme l'accès à votre instance Secure Source Manager et à tous les dépôts de votre projet.

  1. Créez un compte de service si vous n'en avez pas déjà un que vous souhaitez utiliser.

  2. Dans la Google Cloud console, accédez à la Secure Source Manager Permissions page :

    Accéder à Autorisations

  3. Dans l'onglet Service account permissions (Autorisations du compte de service), sélectionnez le compte de service que vous souhaitez utiliser comme compte de service Cloud Build.

  4. Vous pouvez également sélectionner Set as preferred service account (Définir comme compte de service préféré) pour préremplir votre compte de service lorsque vous créez des déclencheurs.

Accorder les autorisations requises au compte de service

  1. Accordez au compte de service les rôles Cloud Build requis pour votre cas d'utilisation. Pour savoir quels rôles Cloud Build sont requis pour différentes actions Cloud Build, consultez la section Configurer l'accès à Cloud Build.

  2. Pour accorder au compte de service les autorisations nécessaires pour récupérer le certificat CA, exécutez la commande suivante.

    gcloud projects add-iam-policy-binding CA_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/privateca.auditor \
      --condition=None
    

    Remplacez les éléments suivants :

    • CA_PROJECT_ID par l'ID du projet du pool d'autorités de certification.
    • SA_EMAILpar l'adresse e-mail du compte de service que vous avez défini comme compte de service Cloud Build.
  3. Pour accorder au compte de service les autorisations nécessaires pour accéder à l'instance Secure Source Manager, exécutez la commande suivante.

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.instanceAccessor \
      --condition=None
    
  4. Pour accorder au compte de service les autorisations nécessaires pour lire des données dans les dépôts Secure Source Manager, exécutez la commande suivante.

    gcloud projects add-iam-policy-binding INSTANCE_PROJECT_ID \
      --member=serviceAccount:SA_EMAIL \
      --role=roles/securesourcemanager.repoReader \
      --condition=None
    

Configurer les journaux de compilation

Lorsque vous spécifiez votre propre compte de service pour les compilations, vous devez stocker vos journaux de compilation dans Cloud Logging ou dans un bucket Cloud Storage créé par l'utilisateur. Vous ne pouvez pas stocker vos journaux dans le bucket de journaux par défaut.

Pour stocker des journaux de compilation dans Cloud Logging, attribuez le rôle Rédacteur de journaux (roles/logging.logWriter) à votre compte de service Cloud Build.

Pour en savoir plus sur la configuration de vos journaux de compilation, consultez la section Configurer des comptes de service spécifiés par l'utilisateur.

Créer une zone Cloud DNS privée

Pour créer une zone DNS privée gérée Cloud DNS, exécutez la commande suivante.

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"

Remplacez les éléments suivants :

  • ZONE_NAME par le nom que vous souhaitez attribuer à la zone gérée.
  • PROJECT_ID : par l'ID de projet du Google Cloud projet que vous souhaitez utiliser pour la zone Cloud DNS.
  • DESCRIPTION par une description de la zone.
  • INSTANCE_LOCATIONpar l'emplacement où vous souhaitez créer votre instance Secure Source Manager.

Pour en savoir plus sur les zones privées gérées Cloud DNS, consultez la page Présentation de Cloud DNS.

Configurer votre réseau de cloud privé virtuel (VPC)

  1. Réservez une plage d'adresses IP que vous souhaitez utiliser pour appairer le VPC Secure Source Manager avec le pool privé Cloud Build.

     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
    

    Remplacez les éléments suivants :

    • CB_PEER_RANGE par le nom de l'adresse à créer.
    • NETWORKpar la ressource réseau dans laquelle les adresses doivent être réservées. Si vous utilisez le réseau par défaut, la valeur est default.
    • INSTANCE_PROJECT_IDpar l'ID du projet de l'instance Private Service Connect.
  2. Pour créer un appairage de VPC avec servicenetworking.googleapis.com, exécutez la commande suivante.

    gcloud services vpc-peerings connect \
      --service=servicenetworking.googleapis.com \
      --ranges=CB_PEER_RANGE \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID
    
  3. Pour créer un domaine DNS appairé à connecter à Cloud Build, exécutez la commande suivante.

    gcloud services peered-dns-domains create DNS_PEERING_DOMAIN \
      --network=NETWORK \
      --project=INSTANCE_PROJECT_ID \
      --dns-suffix=INSTANCE_LOCATION.p.sourcemanager.dev.
    

    Remplacez les éléments suivants :

    • DNS_PEERING_DOMAINpar le nom du domaine DNS appairé que vous créez.

    Les zones DNS privées doivent être partagées explicitement. Pour en savoir plus sur le partage de zones DNS privées, consultez la section Partager des zones DNS privées avec des producteurs de services.

  4. Pour exporter des routes réseau vers Cloud Build, exécutez la commande suivante.

    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. Pour créer le pool privé Cloud Build dans le même Google Cloud projet que l'instance Private Service Connect, exécutez la commande suivante.

    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 correspond au nom du pool privé que vous créez. Le nom doit comporter entre 1 et 63 caractères, et les caractères valides sont [a-zA-Z0-9_-]+.

  6. Pour créer un groupe de points de terminaison du réseau (NEG) Private Service Connect pour le point de terminaison HTTP, exécutez la commande suivante :

    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
    

    Où :

    • HTTP_NEG_NAME correspond au nom du NEG que vous souhaitez créer pour le point de terminaison HTTP.
    • HTTP_PSC correspond à la valeur du point de terminaison HTTP Private Service Connect.
  7. Pour créer un NEG Private Service Connect pour le point de terminaison SSH, exécutez la commande suivante :

    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
    

    Où :

    • SSH_NEG_NAME correspond au nom du NEG que vous souhaitez créer pour le point de terminaison SSH.
    • SSH_PSC correspond à la valeur du point de terminaison SSH Private Service Connect.

Configurer un équilibreur de charge interne (ILB) de proxy

Les points de terminaison ne sont pas accessibles à partir des réseaux VPC appairés. Pour accéder aux points de terminaison Secure Source Manager, vous devez configurer un équilibreur de charge interne (ILB) de couche 4 pour chaque point de terminaison. Pour en savoir plus sur l'accès aux services publiés via des points de terminaison, consultez À propos de l'accès aux services publiés via des points de terminaison.

  1. Pour créer un sous-réseau proxy réservé aux ILB, exécutez la commande suivante.

    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
    

    Où :

    • ILB_PROXY_SUBNET_NAME correspond au nom du sous-réseau à créer.
    • CIDR_RANGE correspond à la plage d'adresses IP principale du sous-réseau. Vous devez utiliser un masque de sous-réseau ne dépassant pas 26 afin qu'au moins 64 adresses IP soient disponibles pour les proxys de la région. La longueur de masque de sous-réseau recommandée est /23. Pour en savoir plus sur les sous-réseaux proxy réservés, consultez la section Sous-réseaux proxy réservés aux équilibreurs de charge basés sur Envoy.
  2. Pour créer un ILB de couche 4 pour le NEG de connexion HTTP, exécutez la commande suivante.

    gcloud compute backend-services create HTTP_PROXY_ILB \
      --project=INSTANCE_PROJECT_ID \
      --region=INSTANCE_LOCATION \
      --load-balancing-scheme=INTERNAL_MANAGED
    

    HTTP_PROXY_ILB correspond au nom de l'ILB à créer pour le point de terminaison HTTP.

  3. Pour créer un ILB de couche 4 pour le NEG de connexion SSH, exécutez la commande suivante.

    gcloud compute backend-services create SSH_PROXY_ILB \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION \
        --load-balancing-scheme=INTERNAL_MANAGED
    

    SSH_PROXY_ILB correspond au nom de l'ILB à créer pour le point de terminaison SSH.

Enregistrer le NEG Private Service Connect comme backend des ILB

  1. Pour enregistrer le NEG HTTP, exécutez la commande suivante.

    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. Pour enregistrer le NEG SSH, exécutez la commande suivante.

    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
    

Créer des proxys TCP cibles pour les ILB

  1. Pour créer un proxy TCP cible pour l'ILB HTTP, exécutez la commande suivante.

    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 correspond au nom du proxy TCP cible que vous souhaitez créer pour l'ILB HTTP.

  2. Pour créer un proxy TCP cible pour l'ILB SSH, exécutez la commande suivante.

    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 correspond au nom du proxy TCP cible que vous créez pour l'ILB SSH.

Créer des règles de transfert pour acheminer le trafic vers les ILB

  1. Pour créer une règle de transfert permettant d'acheminer le trafic vers l'ILB HTTP, exécutez la commande suivante.

    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 correspond au nom de la règle de transfert que vous créez.

  2. Pour créer une règle de transfert permettant d'acheminer le trafic vers l'ILB SSH, exécutez la commande suivante.

    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 correspond au nom de la règle de transfert que vous créez.

Créer vos enregistrements DNS privés

Une fois les règles de transfert configurées, vous devez enregistrer des enregistrements DNS dans votre zone Cloud DNS privée pour chacun des noms d'hôte de l'instance.

  1. Pour obtenir l'adresse IP de votre règle de transfert HTTP, exécutez la commande suivante.

    gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    HTTP_PROXY_FORWARD correspond au nom que vous avez attribué à la règle de transfert pour HTTP.

  2. Pour enregistrer le nom d'hôte de l'API, exécutez la commande suivante.

    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
    

    Remplacez les éléments suivants :

    • INSTANCE_ID par l'ID de votre instance.
    • INSTANCE_PROJECT_NUMBER : par le numéro de projet de votre instance. Google Cloud
    • INSTANCE_LOCATION par la région de votre instance.
    • INSTANCE_PROJECT_ID : par l'ID du projet de votre instance. Google Cloud
    • ZONE_NAME par le nom que vous avez attribué à la zone gérée.
    • HTTP_LB_IP correspond à la sortie de gcloud compute forwarding-rules describe HTTP_PROXY_FORWARD.
  3. Pour enregistrer le nom d'hôte Git HTTP, exécutez la commande suivante.

    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. Pour enregistrer le nom d'hôte HTML de l'interface Web, exécutez la commande suivante.

    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. Pour obtenir l'adresse IP de votre règle de transfert SSH, exécutez la commande suivante.

    gcloud compute forwarding-rules describe SSH_PROXY_FORWARD \
        --project=INSTANCE_PROJECT_ID \
        --region=INSTANCE_LOCATION
    

    SSH_PROXY_FORWARD correspond au nom que vous avez attribué à la règle de transfert pour SSH.

  6. Pour enregistrer le nom d'hôte Git SSH, exécutez la commande suivante.

    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 correspond à la sortie de gcloud compute forwarding-rules describe SSH_PROXY_FORWARD.

Créer un dépôt dans votre instance

Vous pouvez utiliser un hôte bastion pour accéder à un dépôt et en créer un dans votre instance Private Service Connect.

  1. Créez une VM d'hôte bastion avec le cloud-platform champ d'application en suivant les instructions de la section Créer une VM d'hôte bastion.

  2. Créez un dépôt en exécutant la commande suivante.

    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 '{}'
    

    Remplacez les éléments suivants :

    • INSTANCE_IDpar le nom de votre instance Secure Source Manager.
    • PROJECT_NUMBER : par le numéro de projet de votre instance. Google Cloud
    • INSTANCE_LOCATION par l'emplacement de votre instance.
    • REPOSITORY_IDpar le nom que vous souhaitez attribuer à votre dépôt.

    Un dépôt est créé dans votre instance Private Service Connect.

Tester l'accès à Secure Source Manager depuis Cloud Build

Pour vérifier que tout fonctionne correctement, vous pouvez utiliser le fichier de configuration de compilation suivant pour tester la connectivité et extraire le code source de Secure Source Manager. Le fichier de configuration de compilation suppose que vous utilisez Cloud Logging pour stocker vos journaux de compilation. Si vous utilisez un bucket Cloud Storage créé par l'utilisateur, consultez la section Exécuter une compilation à l'aide d'un fichier de configuration pour savoir comment modifier le fichier de configuration de compilation.

Avant d'utiliser le fichier YAML suivant, remplacez les éléments suivants :

  • CA_POOL_NAMEpar le nom du pool d'autorités de certification que vous avez utilisé lors de la création de votre instance Private Service Connect.
  • CA_PROJECT_ID : par le Google Cloud projet que vous avez utilisé pour créer le pool d'autorités de certification.
  • INSTANCE_LOCATION par l'emplacement de votre instance.
  • INSTANCE_ID par le nom de votre instance.
  • INSTANCE_PROJECT_NUMBER : par le numéro de projet de votre instance. Google Cloud
  • REPOSITORY_ID par le nom que vous avez attribué à votre dépôt.
  • SA_PROJECT_IDpar l'ID de projet du compte de service que vous utilisez avec Cloud Build.
  • SERVICE_ACCOUNTpar l'adresse e-mail du compte de service que vous utilisez avec 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

Étape suivante