Exécuter des compilations avec un compte de service géré par l'utilisateur

Ce document explique comment configurer vos builds pour qu'ils utilisent un compte de service géré par l'utilisateur.

Si vous ne spécifiez pas de compte de service géré par l'utilisateur pour vos builds, Cloud Build utilise automatiquement le compte de service Cloud Build par défaut. Ce compte de service par défaut peut disposer d'autorisations inutilement étendues, telles que l'accès à vos dépôts Cloud Source Repositories et à n'importe quel bucket Cloud Storage de votre projet.

Nous vous recommandons de suivre le principe du moindre privilège en attribuant des autorisations et des rôles aux comptes de service limités à la tâche qu'ils effectuent. Par exemple, vous pouvez utiliser un compte de service pour créer et transférer des images vers Artifact Registry, comme indiqué sur le blogGoogle Cloud .

Avant de commencer

  • Activez les API Cloud Build et IAM, si elles ne le sont pas déjà.

    Rôles requis pour activer les API

    Pour activer des API, vous devez disposer 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 Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer les API

  • Si vous prévoyez d'utiliser ce compte pour créer et gérer des identifiants, par exemple pour créer des identifiants éphémères, activez l'API IAM Service Account Credentials.

    Rôles requis pour activer les API

    Pour activer des API, vous devez disposer 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 Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.

    Activer l'API

  • Créez un compte de service, si ce n'est pas déjà fait.

Configurer le compte de service

Attribuez des rôles IAM à votre compte de service géré par l'utilisateur afin qu'il dispose des autorisations nécessaires pour exécuter vos builds. Vous pouvez également configurer Cloud Build pour qu'il choisisse automatiquement ce compte de service pour les nouveaux déclencheurs.

  1. Dans la console Google Cloud , accédez à la page Autorisations de Cloud Build :

    Accéder à Autorisations

  2. Accédez au menu Compte de service, puis sélectionnez votre compte de service. Pour choisir un compte de service dans un autre projet, cliquez sur Changer de projet.

  3. Pour utiliser le compte de service sélectionné comme compte de service pour les nouveaux déclencheurs, activez l'option Définir comme compte présélectionné pour les nouveaux déclencheurs.

  4. Dans la liste des services Google Cloud , activez les rôles IAM que vous souhaitez attribuer à votre compte de service.

  5. Si le rôle dont vous avez besoin pour votre pipeline de compilation n'est pas listé ici, vous pouvez accorder des rôles supplémentaires sur la page des configurations IAM.

  6. Si vous avez sélectionné un compte de service dans un autre projet, suivez les étapes de la section Configuration multiprojet.

Pour en savoir plus sur les rôles IAM généralement requis pour une compilation, consultez les informations suivantes :

Configurer les journaux de compilation

Lorsque vous spécifiez votre propre compte de service pour les builds, vous devez stocker vos journaux de compilation dans l'un des types de buckets suivants :

Si vous créez un bucket de journaux, assurez-vous qu'il ne comporte pas de règle de conservation, car celle-ci pourrait empêcher Cloud Build d'écrire des journaux de compilation dans le bucket.

Vous ne pouvez pas stocker vos journaux dans un bucket de journaux appartenant à Google Cloud.

Pour en savoir plus sur l'emplacement de stockage des journaux de compilation, consultez Options de stockage des journaux de compilation.

Exécuter une compilation à l'aide d'un fichier de configuration

Pour exécuter manuellement une compilation à l'aide d'un fichier de configuration :

  1. Dans le répertoire racine de votre projet, créez un fichier de configuration de compilation Cloud Build nommé cloudbuild.yaml ou cloudbuild.json.

  2. Ajoutez le champ serviceAccount et la configuration de journalisation de votre choix.

    • Si vous stockez les journaux de compilation dans Cloud Logging, ajoutez un champ logging et définissez sa valeur sur CLOUD_LOGGING_ONLY.

    • Si vous stockez les journaux de compilation dans un bucket Cloud Storage créé par l'utilisateur :

      • Ajoutez un champ logging et définissez sa valeur sur GCS_ONLY.
      • Ajoutez un champ logsBucket et définissez sa valeur sur l'emplacement de votre bucket Cloud Storage.

    L'exemple suivant configure Cloud Build pour exécuter des builds à l'aide d'un compte de service géré par l'utilisateur et configure les journaux de build pour qu'ils soient stockés dans un bucket Cloud Storage créé par l'utilisateur :

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    serviceAccount: 'projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "serviceAccount": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    
    

    Remplacez les variables de votre fichier de configuration de compilation par les éléments suivants :

    • LOGS_BUCKET_LOCATION est le bucket Cloud Storage où stocker les journaux de compilation. Exemple :gs://mylogsbucket
    • PROJECT_ID est l'ID du projet Google Cloud dans lequel vous exécutez la compilation.
    • SERVICE_ACCOUNT est l'adresse e-mail ou l'identifiant unique du compte de service que vous souhaitez spécifier pour les builds. Par exemple, l'adresse e-mail d'un compte de service se présente comme suit : service-account-name@project-id.iam.gserviceaccount.com.
  3. Lancez la compilation à l'aide du fichier de configuration de compilation :

    gcloud builds submit --config CONFIG_FILE_PATH SOURCE_DIRECTORY
    

    Remplacez les variables des commandes par les valeurs suivantes :

    • CONFIG_FILE_PATH est le chemin d'accès du fichier de configuration de compilation
    • SOURCE_DIRECTORY est le chemin d'accès ou l'URL du code source.

    Si vous ne spécifiez pas les éléments CONFIG_FILE_PATH et SOURCE_DIRECTORY dans la commande gcloud builds submit, Cloud Build considère que le fichier de configuration de compilation et le code source se trouvent dans le répertoire de travail actuel.

Exécuter des compilations à l'aide de déclencheurs

Pour exécuter une compilation avec des déclencheurs Cloud Build à l'aide de votre propre compte de service, configurez l'option de journalisation de votre choix et sélectionnez le compte de service de votre choix lors de la création du déclencheur.

Si vous souhaitez utiliser le même compte de service pour tous les nouveaux déclencheurs, vous pouvez configurer Cloud Build pour qu'il sélectionne automatiquement le compte de service.

  1. Dans le fichier de configuration de compilation :

    • Si vous stockez les journaux de compilation dans Cloud Logging, ajoutez un champ logging et définissez sa valeur sur CLOUD_LOGGING_ONLY.

    • Si vous stockez les journaux de compilation dans un bucket Cloud Storage créé par l'utilisateur :

      • Ajoutez un champ logging et définissez sa valeur sur GCS_ONLY.
      • Ajoutez un champ logsBucket et définissez sa valeur sur l'emplacement de votre bucket Cloud Storage.

    L'exemple suivant configure les journaux de compilation pour qu'ils soient stockés dans un bucket Cloud Storage créé par l'utilisateur :

    YAML

    steps:
    - name: 'bash'
      args: ['echo', 'Hello world!']
    logsBucket: 'LOGS_BUCKET_LOCATION'
    options:
      logging: GCS_ONLY
    

    JSON

    {
      "steps": [
      {
        "name": "bash",
        "args": [
          "echo",
          "Hello world!"
        ]
      }
      ],
      "logsBucket": "LOGS_BUCKET_LOCATION",
      "options": {
        "logging": "GCS_ONLY"
      }
    }
    

    Remplacez LOGS_BUCKET_LOCATION par le bucket Cloud Storage dans lequel stocker les journaux de compilation. Exemple : gs://mylogsbucket.

  2. Spécifiez un compte de service à utiliser avec votre déclencheur de compilation:

    Console

    1. Créez ou modifiez votre déclencheur de compilation.

    2. Dans le champ Compte de service, spécifiez votre compte de service. Pour choisir un compte de service dans un autre projet, cliquez sur Changer de projet.

      Si vous ne spécifiez pas de compte de service, Cloud Build utilise le compte de service par défaut.

    3. Cliquez sur Créer pour enregistrer le déclencheur de compilation.

    gcloud

    Lors de la création d'un déclencheur de compilation, spécifiez votre compte de service à l'aide de l'option --service-account. Dans l'exemple suivant, la commande gcloud crée un déclencheur de compilation qui extrait le code d'un dépôt Git :

    gcloud builds triggers create github \
       --name=TRIGGER_NAME \
       --repo-name=REPO_NAME \
       --repo-owner=REPO_OWNER \
       --branch-pattern=BRANCH_PATTERN
       --build-config=BUILD_CONFIG_FILE
       --service-account=SERVICE_ACCOUNT
       --project=BUILD_PROJECT
    

    Remplacez les variables du fichier de configuration de compilation par les valeurs suivantes :

    • TRIGGER_NAME correspond au nom de votre déclencheur de compilation.
    • REPO_NAME est le nom du dépôt.
    • REPO_OWNER est le nom d'utilisateur du propriétaire du dépôt.
    • BRANCH_PATTERN est le nom de la branche de votre dépôt sur lequel appeler la compilation.
    • TAG_PATTERN est le nom du tag de votre dépôt sur lequel appeler la compilation.
    • BUILD_CONFIG_FILE correspond au chemin d'accès à votre fichier de configuration de compilation.
    • SERVICE_ACCOUNT est votre compte de service au format /projects/PROJECT_ID/serviceAccounts/ACCOUNT_ID_OR_EMAIL.
    • BUILD_PROJECT est le projet dans lequel vous démarrez des builds.

Configuration multiprojet

Vous ne pouvez utiliser un compte de service géré par l'utilisateur pour exécuter des compilations dans un projet différent de celui où vous avez créé le compte de service que si la contrainte de règle d'administration iam.disableCrossProjectServiceAccountUsage n'est pas appliquée. Cette contrainte est appliquée par défaut. En savoir plus

  • La commande suivante désactive l'application de cette contrainte et accorde l'accès nécessaire. Votre organisation doit être consciente des compromis de sécurité impliqués avant de définir la contrainte dans votre règle d'administration :

    gcloud resource-manager org-policies disable-enforce \
       iam.disableCrossProjectServiceAccountUsage \
       --project=SERVICE_ACCOUNT_PROJECT_ID
    

    Dans cette commande, SERVICE_ACCOUNT_PROJECT_ID est le projet qui contient votre compte de service géré par l'utilisateur.

  • Dans le projet qui dispose de votre compte de service géré par l'utilisateur, attribuez le rôle roles/iam.serviceAccountTokenCreator à l'agent de service Cloud Build du projet dans lequel vous exécutez les builds :

    gcloud projects add-iam-policy-binding SERVICE_ACCOUNT_PROJECT_ID \
        --member="serviceAccount:BUILD_SERVICE_AGENT" \
        --role="roles/iam.serviceAccountTokenCreator"
    

    Remplacez les variables de la commande par les éléments suivants :

    • SERVICE_ACCOUNT_PROJECT_ID : ID du projet contenant votre compte de service géré par l'utilisateur.
    • BUILD_SERVICE_AGENT : ID de l'adresse e-mail de l'agent de service au format service-BUILD_PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com, où BUILD_PROJECT_NUMBER est le numéro du projet dans lequel vous exécutez des builds. Vous pouvez obtenir le numéro de projet sur la page des paramètres du projet.

Limites :

  • Votre projet Google Cloud doit se trouver dans une organisation Google Cloud .

  • Vous devez lancer les builds dans la ligne de commande à l'aide de gcloud builds submit ou gcloud builds triggers create.

  • Si vous recevez une erreur service account not found lors de l'attribution du rôle IAM, vous devrez peut-être créer manuellement l'agent de service.

Étapes suivantes