Créer et gérer des comptes de service

Cette page explique comment créer et gérer des comptes de service à l'aide de l'API Cloud IAM (Cloud Identity and Access Management), de Google Cloud Console et de l'outil de ligne de commande gcloud.

Lorsque vous créez un projet Cloud, Google Cloud crée automatiquement un compte de service Compute Engine et un compte de service App Engine associés à ce projet. Vous pouvez créer jusqu'à 98 comptes de service supplémentaires dans votre projet pour contrôler l'accès à vos ressources.

Avant de commencer

Autorisations requises

Pour autoriser un utilisateur à gérer des comptes de service, attribuez-lui l'un des rôles suivants :

  • Utilisateur de compte de service (roles/iam.serviceAccountUser) : accorde les autorisations nécessaires pour obtenir ou répertorier un compte de service et emprunter son identité.
  • Administrateur de compte de service (roles/iam.serviceAccountAdmin) : comprend les autorisations permettant de répertorier les comptes de service et d'obtenir des informations sur un compte de service. Il inclut également les autorisations nécessaires pour créer, mettre à jour et supprimer des comptes de service, ainsi que pour afficher ou modifier la stratégie Cloud IAM associée à un compte de service.

Les rôles primitifs Cloud IAM contiennent également les autorisations nécessaires pour gérer les comptes de service. Nous vous recommandons cependant d'attribuer l'un des rôles prédéfinis ci-dessus afin de prévenir tout accès superflu à d'autres ressources Google Cloud. Pour en savoir plus sur ces rôles, consultez la liste des rôles liés aux comptes de service.

Créer un compte de service

La création d'un compte de service s'apparente à l'ajout d'un membre à un projet, à ceci près que le compte de service appartient à vos applications plutôt qu'à un utilisateur final particulier.

Lorsque vous créez un compte de service, vous devez fournir un ID alphanumérique (sa-name dans les exemples ci-dessous), tel que my-service-account. L'ID doit comporter entre 6 et 30 caractères alphanumériques pouvant inclure des minuscules et des tirets. Une fois le compte de service créé, vous ne pouvez pas en modifier le nom.

Le nom d'un compte de service est un identifiant unique qui apparaît dans l'adresse e-mail correspondante provisionnée lors de la création, telle que sa-name@project-id.iam.gserviceaccount.com.

Chaque compte de service possède également un ID numérique unique, généré automatiquement.

Lors de la création d'un compte de service, vous devez également fournir les informations suivantes :

  • sa-description est une description facultative du compte de service.
  • sa-display-name est un nom convivial pour le compte de service.
  • project-id est l'ID du projet Google Cloud.

Pour supprimer un compte de service, l'utilisateur doit au moins disposer du rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) ou du rôle primitif Éditeur (roles/editor).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez votre projet et cliquez sur Ouvrir.

  3. Cliquez sur Créer un compte de service.

  4. Saisissez un nom de compte de service (nom d'affichage convivial) et une description facultative, puis sélectionnez le rôle que vous souhaitez accorder au compte de service et cliquez sur Enregistrer.

Commande gcloud

Exécutez la commande gcloud iam service-accounts create pour créer un compte de service.

Commande :

gcloud iam service-accounts create sa-name \
    --description="sa-description" \
    --display-name="sa-display-name"

Le résultat inclut le nom du compte de service :

Created service account [sa-name].

API REST

La méthode serviceAccounts.create crée un compte de service.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-name : ID alphanumérique de votre compte de service. Ce nom doit comporter entre 6 et 30 caractères. Il peut inclure des caractères alphanumériques minuscules et des tirets.
  • sa-description : facultatif. Description du compte de service.
  • sa-display-name : nom lisible du compte de service.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts

Corps JSON de la requête :

{
  "accountId": "sa-name",
  "serviceAccount": {
    "description": "sa-description",
    "displayName": "sa-display-name"
  }
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "projectId": "my-project",
  "uniqueId": "123456789012345678901",
  "email": "my-service-account@my-project.iam.gserviceaccount.com",
  "displayName": "My service account",
  "etag": "BwUp3rVlzes=",
  "description": "A service account for running jobs in my project",
  "oauth2ClientId": "987654321098765432109"
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccounts
{
    public static ServiceAccount CreateServiceAccount(string projectId,
        string name, string displayName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new CreateServiceAccountRequest
        {
            AccountId = name,
            ServiceAccount = new ServiceAccount
            {
                DisplayName = displayName
            }
        };
        var serviceAccount = service.Projects.ServiceAccounts.Create(
            request, "projects/" + projectId).Execute();
        Console.WriteLine("Created service account: " + serviceAccount.Email);
        return serviceAccount;
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// createServiceAccount creates a service account.
func createServiceAccount(w io.Writer, projectID, name, displayName string) (*iam.ServiceAccount, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	request := &iam.CreateServiceAccountRequest{
		AccountId: name,
		ServiceAccount: &iam.ServiceAccount{
			DisplayName: displayName,
		},
	}
	account, err := service.Projects.ServiceAccounts.Create("projects/"+projectID, request).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Create: %v", err)
	}
	fmt.Fprintf(w, "Created service account: %v", account)
	return account, nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.CreateServiceAccountRequest;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class CreateServiceAccount {

  // Creates a service account.
  public static void createServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      ServiceAccount serviceAccount = new ServiceAccount();
      serviceAccount.setDisplayName("your-display-name");
      CreateServiceAccountRequest request = new CreateServiceAccountRequest();
      request.setAccountId(serviceAccountName);
      request.setServiceAccount(serviceAccount);

      serviceAccount =
          service.projects().serviceAccounts().create("projects/" + projectId, request).execute();

      System.out.println("Created service account: " + serviceAccount.getEmail());
    } catch (IOException e) {
      System.out.println("Unable to create service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def create_service_account(project_id, name, display_name):
    """Creates a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    my_service_account = service.projects().serviceAccounts().create(
        name='projects/' + project_id,
        body={
            'accountId': name,
            'serviceAccount': {
                'displayName': display_name
            }
        }).execute()

    print('Created service account: ' + my_service_account['email'])
    return my_service_account

Une fois la création du compte de service terminée, attribuez un ou plusieurs rôles à ce compte de service afin qu'il puisse agir en votre nom.

Répertorier les comptes de service

Lorsque vous créez la liste des comptes de service, vous pouvez spécifier des paramètres permettant de limiter le nombre de comptes de service à inclure dans la réponse. Vous pourrez ensuite spécifier ListServiceAccountsResponse.next_page_token dans une requête ultérieure pour répertorier les comptes de service restants.

Cette méthode vous permet d'auditer les comptes et les clés de service, ainsi que de créer des outils personnalisés de gestion des comptes de service.

Pour répertorier les comptes de service, l'utilisateur doit au moins disposer du rôle Utilisateur de compte de service (roles/iam.serviceAccountUser) ou du rôle primitif Lecteur (roles/viewer).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet.

  3. Sélectionnez votre projet et cliquez sur Ouvrir. Tous les comptes de service sont répertoriés sur la page "Comptes de service".

Commande gcloud

Exécutez la commande gcloud iam service-accounts list pour répertorier tous les comptes de service d'un projet.

Commande :

gcloud iam service-accounts list

La sortie correspond à la liste de tous les comptes de service du projet :

NAME                    EMAIL
sa-display-name-1       sa-name-1@project-id.iam.gserviceaccount.com
sa-display-name-2       sa-name-2@project-id.iam.gserviceaccount.com

API REST

La méthode serviceAccounts.list répertorie tous les comptes de service de votre projet.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.

Méthode HTTP et URL :

GET https://iam.googleapis.com/v1/projects/project-id/serviceAccounts

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "accounts": [
    {
      "name": "projects/my-project/serviceAccounts/sa-1@my-project.iam.gserviceaccount.com",
      "projectId": "my-project",
      "uniqueId": "123456789012345678901",
      "email": "sa-1@my-project.iam.gserviceaccount.com",
      "description": "My first service account",
      "displayName": "Service account 1",
      "etag": "BwUpTsLVUkQ=",
      "oauth2ClientId": "987654321098765432109"
    },
    {
      "name": "projects/my-project/serviceAccounts/sa-2@my-project.iam.gserviceaccount.com",
      "projectId": "my-project",
      "uniqueId": "234567890123456789012",
      "email": "sa-2@my-project.iam.gserviceaccount.com",
      "description": "My second service account",
      "displayName": "Service account 2",
      "etag": "UkQpTwBVUsL=",
      "oauth2ClientId": "876543210987654321098"
    }
  ]
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using System.Collections.Generic;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccounts
{
    public static IList<ServiceAccount> ListServiceAccounts(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var response = service.Projects.ServiceAccounts.List(
            "projects/" + projectId).Execute();
        foreach (ServiceAccount account in response.Accounts)
        {
            Console.WriteLine("Name: " + account.Name);
            Console.WriteLine("Display Name: " + account.DisplayName);
            Console.WriteLine("Email: " + account.Email);
            Console.WriteLine();
        }
        return response.Accounts;
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// listServiceAccounts lists a project's service accounts.
func listServiceAccounts(w io.Writer, projectID string) ([]*iam.ServiceAccount, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	response, err := service.Projects.ServiceAccounts.List("projects/" + projectID).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.List: %v", err)
	}
	for _, account := range response.Accounts {
		fmt.Fprintf(w, "Listing service account: %v\n", account.Name)
	}
	return response.Accounts, nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ListServiceAccountsResponse;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class ListServiceAccounts {

  // Lists all service accounts for the current project.
  public static void listServiceAccounts(String projectId) {
    // String projectId = "my-project-id"

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      ListServiceAccountsResponse response =
          service.projects().serviceAccounts().list("projects/" + projectId).execute();
      List<ServiceAccount> serviceAccounts = response.getAccounts();

      for (ServiceAccount account : serviceAccounts) {
        System.out.println("Name: " + account.getName());
        System.out.println("Display Name: " + account.getDisplayName());
        System.out.println("Email: " + account.getEmail());
        System.out.println();
      }
    } catch (IOException e) {
      System.out.println("Unable to list service accounts: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def list_service_accounts(project_id):
    """Lists all service accounts for the current project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service_accounts = service.projects().serviceAccounts().list(
        name='projects/' + project_id).execute()

    for account in service_accounts['accounts']:
        print('Name: ' + account['name'])
        print('Email: ' + account['email'])
        print(' ')
    return service_accounts

Mettre à jour un compte de service

Le nom d'affichage (nom convivial) et la description d'un compte de service permettent généralement d'obtenir des informations supplémentaires le concernant, telles que sa finalité ou une personne à contacter.

Pour mettre à jour le nom ou la description d'un compte de service, l'utilisateur doit au moins disposer du rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) ou du rôle primitif Éditeur (roles/editor).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez votre projet et cliquez sur Ouvrir.

  3. Recherchez le compte de service dont vous souhaitez modifier le nom, cliquez sur le bouton   de cette ligne, puis cliquez sur Modifier.

  4. Saisissez le nouveau nom, puis cliquez sur Enregistrer.

Commande gcloud

Exécutez la commande gcloud iam service-accounts update pour mettre à jour un compte de service.

Commande :

gcloud iam service-accounts update \
    sa-name@project-id.iam.gserviceaccount.com \
    --description="updated-sa-description" \
    --display-name="updated-display-name"

La sortie confirme le changement de nom du compte de service :

description: updated-sa-description
displayName: updated-display-name
name: projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com

API REST

La méthode serviceAccounts.patch met à jour un compte de service.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.
  • sa-name : ID alphanumérique de votre compte de service. Ce nom doit comporter entre 6 et 30 caractères. Il peut inclure des caractères alphanumériques minuscules et des tirets.
  • Remplacez au moins l'un des éléments suivants :
    • updated-display-name : nouveau nom à afficher pour votre compte de service.
    • updated-description : nouvelle description de votre compte de service.

Méthode HTTP et URL :

PATCH https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id 

Corps JSON de la requête :

{
  "serviceAccount": {
    "email": "sa-name@project-id.iam.gserviceaccount.com",
    "displayName": "updated-display-name",
    "description": "updated-description"
  },
  "updateMask": "displayName,description"
}

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

{
  "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
  "displayName": "My updated service account",
  "description": "An updated description of my service account"
}

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccounts
{
    public static ServiceAccount RenameServiceAccount(string email,
        string newDisplayName)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        // First, get a ServiceAccount using List() or Get().
        string resource = "projects/-/serviceAccounts/" + email;
        var serviceAccount = service.Projects.ServiceAccounts.Get(resource)
            .Execute();
        // Then you can update the display name.
        serviceAccount.DisplayName = newDisplayName;
        serviceAccount = service.Projects.ServiceAccounts.Update(
            serviceAccount, resource).Execute();
        Console.WriteLine($"Updated display name for {serviceAccount.Email} " +
            "to: " + serviceAccount.DisplayName);
        return serviceAccount;
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// renameServiceAccount renames a service account.
func renameServiceAccount(w io.Writer, email, newDisplayName string) (*iam.ServiceAccount, error) {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return nil, fmt.Errorf("iam.NewService: %v", err)
	}

	// First, get a ServiceAccount using List() or Get().
	resource := "projects/-/serviceAccounts/" + email
	serviceAccount, err := service.Projects.ServiceAccounts.Get(resource).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Get: %v", err)
	}
	// Then you can update the display name.
	serviceAccount.DisplayName = newDisplayName
	serviceAccount, err = service.Projects.ServiceAccounts.Update(resource, serviceAccount).Do()
	if err != nil {
		return nil, fmt.Errorf("Projects.ServiceAccounts.Update: %v", err)
	}

	fmt.Fprintf(w, "Updated service account: %v", serviceAccount.Email)
	return serviceAccount, nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.ServiceAccount;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class RenameServiceAccount {

  // Changes a service account's display name.
  public static void renameServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      // First, get a service account using List() or Get()
      ServiceAccount serviceAccount =
          service
              .projects()
              .serviceAccounts()
              .get("projects/-/serviceAccounts/" + serviceAccountEmail)
              .execute();

      // Then you can update the display name
      serviceAccount.setDisplayName("your-new-display-name");
      serviceAccount =
          service
              .projects()
              .serviceAccounts()
              .update(serviceAccount.getName(), serviceAccount)
              .execute();

      System.out.println(
          "Updated display name for "
              + serviceAccount.getName()
              + " to: "
              + serviceAccount.getDisplayName());
    } catch (IOException e) {
      System.out.println("Unable to rename service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def rename_service_account(email, new_display_name):
    """Changes a service account's display name."""

    # First, get a service account using List() or Get()
    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    resource = 'projects/-/serviceAccounts/' + email

    my_service_account = service.projects().serviceAccounts().get(
        name=resource).execute()

    # Then you can update the display name
    my_service_account['displayName'] = new_display_name
    my_service_account = service.projects().serviceAccounts().update(
        name=resource, body=my_service_account).execute()

    print('Updated display name for {} to: {}'.format(
        my_service_account['email'], my_service_account['displayName']))
    return my_service_account

Désactiver un compte de service

Comme pour la suppression, lorsque vous désactivez un compte de service, les applications ne peuvent plus s'en servir pour accéder aux ressources Google Cloud. Si vous désactivez les comptes de service App Engine et Compute Engine par défaut, les instances n'auront plus accès aux ressources du projet. Si vous tentez de désactiver un compte de service déjà désactivé, l'action n'aura aucun effet.

Contrairement à la suppression, la réactivation des comptes de service désactivés s'effectue aisément si nécessaire. Nous vous recommandons de désactiver un compte de service avant de le supprimer. Vous pourrez ainsi vous assurer qu'aucune application critique n'utilise ce compte de service.

Pour désactiver un compte de service, l'utilisateur doit posséder au minimum le rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) ou le rôle primitif Éditeur (roles/editor).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez votre projet et cliquez sur Ouvrir.

  3. Cliquez sur le nom du compte de service que vous souhaitez désactiver.

  4. Sous État du compte de service, cliquez sur Désactiver le compte de service, puis cliquez sur Désactiver pour confirmer la modification.

Commande gcloud

Exécutez la commande gcloud iam service-accounts disable pour désactiver un compte de service.

Commande :

gcloud iam service-accounts disable sa-name@project-id.iam.gserviceaccount.com

Sortie :

Disabled service account sa-name@project-id.iam.gserviceaccount.com

API REST

La méthode serviceAccounts.disable désactive immédiatement un compte de service.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:disable

Pour envoyer votre requête, développez l'une des options suivantes :

Si la requête aboutit, le corps de la réponse sera vide.

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccounts
{
    public static void DisableServiceAccount(string email)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new DisableServiceAccountRequest();

        string resource = "projects/-/serviceAccounts/" + email;
        service.Projects.ServiceAccounts.Disable(request, resource).Execute();
        Console.WriteLine("Disabled service account: " + email);
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// disableServiceAccount disables a service account.
func disableServiceAccount(w io.Writer, email string) error {
	// email:= service-account@your-project.iam.gserviceaccount.com
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %v", err)
	}

	request := &iam.DisableServiceAccountRequest{}
	_, err = service.Projects.ServiceAccounts.Disable("projects/-/serviceAccounts/"+email, request).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Disable: %v", err)
	}
	fmt.Fprintf(w, "Disabled service account: %v", email)
	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.DisableServiceAccountRequest;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DisableServiceAccount {

  // Disables a service account.
  public static void disableServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      DisableServiceAccountRequest request = new DisableServiceAccountRequest();
      service
          .projects()
          .serviceAccounts()
          .disable("projects/-/serviceAccounts/" + serviceAccountEmail, request)
          .execute();

      System.out.println("Disabled service account: " + serviceAccountEmail);
    } catch (IOException e) {
      System.out.println("Unable to disable service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def disable_service_account(email):
    """Disables a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service.projects().serviceAccounts().disable(
        name='projects/-/serviceAccounts/' + email).execute()

    print("Disabled service account :" + email)

Activer un compte de service

Après avoir activé un compte de service désactivé, les applications peuvent de nouveau s'en servir pour accéder aux ressources Google Cloud.

Vous pouvez réactiver un compte de service désactivé quand vous voulez. Si vous tentez de réactiver un compte de service déjà activé, l'action n'aura aucun effet.

Pour activer un compte de service, l'utilisateur doit posséder au minimum le rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) ou le rôle primitif Éditeur (roles/editor).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez votre projet et cliquez sur Ouvrir.

  3. Cliquez sur le nom du compte de service que vous souhaitez activer.

  4. Sous État du compte de service, cliquez sur Activer le compte de service, puis cliquez sur Activer pour confirmer la modification.

Commande gcloud

Exécutez la commande gcloud iam service-accounts enable pour activer un compte de service.

Commande :

gcloud iam service-accounts enable sa-name@project-id.iam.gserviceaccount.com

Sortie :

Enabled service account sa-name@project-id.iam.gserviceaccount.com

API REST

La méthode serviceAccounts.enable active un compte de service précédemment désactivé.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id:enable

Pour envoyer votre requête, développez l'une des options suivantes :

Si la requête aboutit, le corps de la réponse sera vide.

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;
using Google.Apis.Iam.v1.Data;

public partial class ServiceAccounts
{
    public static void EnableServiceAccount(string email)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        var request = new EnableServiceAccountRequest();

        string resource = "projects/-/serviceAccounts/" + email;
        service.Projects.ServiceAccounts.Enable(request, resource).Execute();
        Console.WriteLine("Enabled service account: " + email);
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// enableServiceAccount enables a service account.
func enableServiceAccount(w io.Writer, email string) error {
	// email:= service-account@your-project.iam.gserviceaccount.com
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %v", err)
	}

	request := &iam.EnableServiceAccountRequest{}
	_, err = service.Projects.ServiceAccounts.Enable("projects/-/serviceAccounts/"+email, request).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Enable: %v", err)
	}
	fmt.Fprintf(w, "Enabled service account: %v", email)
	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.api.services.iam.v1.model.EnableServiceAccountRequest;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class EnableServiceAccount {

  // Enables a service account.
  public static void enableServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      EnableServiceAccountRequest request = new EnableServiceAccountRequest();
      service
          .projects()
          .serviceAccounts()
          .enable("projects/-/serviceAccounts/" + serviceAccountEmail, request)
          .execute();

      System.out.println("Enabled service account: " + serviceAccountEmail);
    } catch (IOException e) {
      System.out.println("Unable to enable service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def enable_service_account(email):
    """Enables a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service.projects().serviceAccounts().enable(
        name='projects/-/serviceAccounts/' + email).execute()

    print("Enabled service account :" + email)

Supprimer un compte de service

Lorsque vous supprimez un compte de service, les applications ne peuvent plus s'en servir pour accéder aux ressources Google Cloud. Si vous supprimez les comptes de service par défaut App Engine et Compute Engine, les instances n'auront plus accès aux ressources du projet.

Avant de supprimer un compte de service, prenez la précaution de vérifier qu'il n'est plus utilisé par vos applications critiques. Si vous n'êtes pas sûr qu'un compte de service est utilisé, nous vous recommandons de le désactiver avant de le supprimer. La réactivation des comptes de service désactivés s'effectue aisément si ceux-ci sont toujours en cours d'utilisation.

Lorsqu'un compte de service est supprimé, ses liaisons de rôle ne sont pas immédiatement supprimées. Elles sont supprimées définitivement du système, de façon automatique, après un délai maximal de 60 jours.

Les comptes de service supprimés ne sont pas comptabilisés dans votre quota de compte de service.

Pour supprimer un compte de service, l'utilisateur doit posséder au minimum le rôle Administrateur de compte de service (roles/iam.serviceAccountAdmin) ou le rôle primitif Éditeur (roles/editor).

Console

  1. Dans Cloud Console, accédez à la page Comptes de service.

    Accéder à la page "Comptes de service"

  2. Cliquez sur Sélectionner un projet, choisissez un projet et cliquez sur Ouvrir.

  3. Sélectionnez le ou les comptes de service que vous souhaitez supprimer, puis cliquez sur Supprimer ().

Commande gcloud

Exécutez la commande gcloud iam service-accounts delete pour supprimer un compte de service.

Commande :

gcloud iam service-accounts delete \
    sa-name@project-id.iam.gserviceaccount.com

Sortie :

Deleted service account sa-name@project-id.iam.gserviceaccount.com

API REST

La méthode serviceAccounts.delete supprime un compte de service.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-id : ID de votre compte de service. Il peut s'agir de l'adresse e-mail du compte de service au format sa-name@project-id.iam.gserviceaccount.com ou de l'ID numérique unique du compte de service.

Méthode HTTP et URL :

DELETE https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-id

Pour envoyer votre requête, développez l'une des options suivantes :

Si la requête aboutit, le corps de la réponse sera vide.

C#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.


using System;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Iam.v1;

public partial class ServiceAccounts
{
    public static void DeleteServiceAccount(string email)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(IamService.Scope.CloudPlatform);
        var service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        string resource = "projects/-/serviceAccounts/" + email;
        service.Projects.ServiceAccounts.Delete(resource).Execute();
        Console.WriteLine("Deleted service account: " + email);
    }
}

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Go.

import (
	"context"
	"fmt"
	"io"

	iam "google.golang.org/api/iam/v1"
)

// deleteServiceAccount deletes a service account.
func deleteServiceAccount(w io.Writer, email string) error {
	ctx := context.Background()
	service, err := iam.NewService(ctx)
	if err != nil {
		return fmt.Errorf("iam.NewService: %v", err)
	}

	_, err = service.Projects.ServiceAccounts.Delete("projects/-/serviceAccounts/" + email).Do()
	if err != nil {
		return fmt.Errorf("Projects.ServiceAccounts.Delete: %v", err)
	}
	fmt.Fprintf(w, "Deleted service account: %v", email)
	return nil
}

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.iam.v1.Iam;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class DeleteServiceAccount {

  // Deletes a service account.
  public static void deleteServiceAccount(String projectId, String serviceAccountName) {
    // String projectId = "my-project-id";
    // String serviceAccountName = "my-service-account-name";

    Iam service = null;
    try {
      service = initService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    String serviceAccountEmail = serviceAccountName + "@" + projectId + ".iam.gserviceaccount.com";
    try {
      service
          .projects()
          .serviceAccounts()
          .delete("projects/-/serviceAccounts/" + serviceAccountEmail)
          .execute();

      System.out.println("Deleted service account: " + serviceAccountEmail);
    } catch (IOException e) {
      System.out.println("Unable to delete service account: \n" + e.toString());
    }
  }

  private static Iam initService() throws GeneralSecurityException, IOException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));
    // Initialize the IAM service, which can be used to send requests to the IAM API.
    Iam service =
        new Iam.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

import os

from google.oauth2 import service_account
import googleapiclient.discovery

def delete_service_account(email):
    """Deletes a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    service.projects().serviceAccounts().delete(
        name='projects/-/serviceAccounts/' + email).execute()

    print('Deleted service account: ' + email)

Après avoir supprimé un compte de service, évitez de créer un compte de service portant le même nom. Cela peut entraîner un comportement inattendu. Pour plus d'informations, consultez la section Supprimer et recréer des comptes de service.

Annuler la suppression d'un compte de service

Dans certains cas, vous pouvez utiliser la commande undelete pour annuler la suppression d'un compte de service. Vous pouvez généralement annuler la suppression d'un compte de service s'il répond aux critères suivants :

  • Le compte de service a été supprimé il y a moins de 30 jours.

    Au bout de 30 jours, Cloud IAM supprime définitivement le compte de service. Google Cloud ne peut pas récupérer le compte de service après sa suppression définitive, même si vous déposez une demande d'assistance.

  • Il n'existe aucun compte de service portant le même nom que le compte de service supprimé.

    Par exemple, supposons que vous supprimiez accidentellement le compte de service my-service-account@project-id.iam.gserviceaccount.com. Vous avez toujours besoin d'un compte de service portant ce nom. Vous devez donc créer un autre compte de service portant le même nom, my-service-account@project-id.iam.gserviceaccount.com.

    Le nouveau compte de service n'hérite pas des autorisations du compte de service supprimé. En réalité, il est complètement distinct du compte de service supprimé. Cependant, vous ne pouvez pas annuler la suppression du compte de service d'origine, car le nouveau compte de service porte le même nom.

    Pour résoudre ce problème, supprimez le nouveau compte de service, puis essayez d'annuler la suppression du compte de service d'origine.

Si vous ne parvenez pas à annuler la suppression du compte de service, vous pouvez en créer un autre portant le même nom, révoquer tous les rôles du compte de service supprimé, puis attribuer les mêmes rôles au nouveau compte de service. Pour en savoir plus, consultez l'article Règles concernant les membres supprimés.

Trouver l'ID numérique du compte de service

Lorsque vous annulez la suppression d'un compte de service, vous devez indiquer son ID numérique. L'ID numérique est un numéro à 21 chiffres, tel que 123456789012345678901, qui identifie de manière unique le compte de service. Par exemple, si vous supprimez un compte de service, puis créez un compte de service portant le même nom, le compte de service d'origine et le nouveau compte de service auront des ID numériques différents.

À compter du 14 septembre 2020, si vous savez qu'une liaison de stratégie Cloud IAM inclut le compte de service supprimé, vous pouvez obtenir la stratégie, puis rechercher l'ID numérique dans la stratégie. L'ID numérique est ajouté au nom du compte de service supprimé. Par exemple, dans cette stratégie, l'ID numérique du compte de service supprimé est 123456789012345678901 :

{
  "version": 1,
  "etag": "BwUjMhCsNvY=",
  "bindings": [
    {
      "members": [
        "deleted:serviceAccount:my-service-account@project-id.iam.gserviceaccount.com?uid=123456789012345678901"
      ],
      "role": "roles/iam.serviceAccountUser"
    },
  ]
}

Vous pouvez également rechercher dans vos journaux d'audit l'opération DeleteServiceAccount qui a supprimé le compte de service :

  1. Dans Cloud Console, accédez à la page Visionneuse de journaux.

    Accéder à la page "Visionneuse de journaux"

  2. Dans le champ de recherche en haut de la page, cliquez sur la flèche de développement (arrow_drop_down), puis sélectionnez Convert to advanced filter (Convertir en filtre avancé).

  3. Dans le champ de recherche, saisissez la requête suivante, en remplaçant service-account-email par l'adresse e-mail de votre compte de service (par exemple, my-service-account@project-id.iam.gserviceaccount.com) :

    resource.type="service_account"
    resource.labels.email_id="service-account-email"
    "DeleteServiceAccount"
    
  4. Si le compte de service a été supprimé il y a plus d'une heure, sélectionnez la liste déroulante Dernière heure (schedule), puis sélectionnez une période plus longue.

    Si le compte de service a été supprimé il y a plus de sept jours, sélectionnez Aucune limite.

  5. Cliquez sur Envoyer le filtre. La Visionneuse de journaux affiche les opérations DeleteServiceAccount qui ont affecté les comptes de service portant le nom que vous avez spécifié. L'ID numérique de chaque compte de service apparaît à côté du texte DeleteServiceAccount.

    Si les résultats de recherche n'incluent qu'une seule opération DeleteServiceAccount, notez l'ID numérique. Il vous permettra d'annuler la suppression du compte de service.

    S'il y a plusieurs résultats de recherche, cliquez sur la flèche de développement () à côté d'un résultat de recherche. Examinez les détails de l'entrée de journal et déterminez si celle-ci affiche l'opération que vous souhaitez annuler. Répétez cette procédure jusqu'à ce que vous trouviez l'entrée de journal appropriée, puis notez l'ID numérique dans cette entrée.

Annuler la suppression du compte de service à l'aide de l'ID numérique

Une fois que vous avez trouvé l'ID numérique du compte de service concerné, vous pouvez tenter d'annuler sa suppression.

Commande gcloud

Exécutez la commande gcloud beta iam service-accounts undelete pour annuler la suppression d'un compte de service.

Commande :

gcloud beta iam service-accounts undelete account-id

Sortie :

restoredAccount:
  email: sa-name@project-id.iam.gserviceaccount.com
  etag: BwWWE7zpApg=
  name: projects/project-id/serviceAccounts/sa-name@project-id.iam.gserviceaccount.com
  oauth2ClientId: '123456789012345678901'
  projectId: project-id
  uniqueId: 'account-id'

API REST

La méthode serviceAccounts.undelete restaure un compte de service supprimé.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • project-id : ID de votre projet Google Cloud.
  • sa-numeric-id : ID numérique unique du compte de service.

Méthode HTTP et URL :

POST https://iam.googleapis.com/v1/projects/project-id/serviceAccounts/sa-numeric-id:undelete

Pour envoyer votre requête, développez l'une des options suivantes :

S'il est possible d'annuler la suppression du compte, vous recevez un code de réponse 200 OK avec des détails sur le compte de service restauré, semblable à ce qui suit :

{
  "restoredAccount": {
    "name": "projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com",
    "projectId": "my-project",
    "uniqueId": "123456789012345678901",
    "email": "my-service-account@my-project.iam.gserviceaccount.com",
    "displayName": "My service account",
    "etag": "BwUp3rVlzes=",
    "description": "A service account for running jobs in my project",
    "oauth2ClientId": "987654321098765432109"
  }
}

Étapes suivantes