Crea y administra cuentas de servicio

En esta página, se explica cómo crear y administrar cuentas de servicio con la API de Cloud Identity and Access Management, Google Cloud Console y la herramienta de línea de comandos de gcloud.

Cuando creas un proyecto nuevo de Cloud, Google Cloud crea de forma automática una cuenta de servicio de Compute Engine y una de App Engine en ese proyecto. Se pueden crear hasta 98 cuentas de servicio adicionales para tu proyecto a fin de controlar el acceso a tus recursos.

Antes de comenzar

Permisos necesarios

Para permitir que un usuario administre cuentas de servicio, otorga una de las siguientes funciones:

  • Usuario de cuenta de servicio (roles/iam.serviceAccountUser): Otorga los permisos para obtener, enumerar o actuar en nombre de una cuenta de servicio.
  • Administrador de cuenta de servicio (roles/iam.serviceAccountAdmin): Incluye permisos de usuario de cuenta de servicio y, también, otorga permisos para crear, actualizar, borrar y obtener o establecer la política de Cloud IAM en una cuenta de servicio.

Las funciones básicas de Cloud IAM también contienen permisos para administrar cuentas de servicio. Sin embargo, recomendamos que otorgues una de las funciones predefinidas anteriores para evitar el acceso innecesario a otros recursos de Google Cloud. Para obtener más información acerca de estas funciones, consulta la lista de funciones de cuentas de servicio.

Crea una cuenta de servicio

Crear una cuenta de servicio es un proceso similar a agregar un miembro a tu proyecto, pero la cuenta de servicio pertenece a tus aplicaciones, en lugar de a un usuario final individual.

En los ejemplos a continuación, [SA-NAME] es el nombre de la cuenta de servicio que proporcionas, como my-service-account. Este es un identificador único que aparecerá en la dirección de correo electrónico de la cuenta de servicio que se aprovisione durante la creación, como my-service-account@project-id.iam.gserviceaccount.com. También lo usarás para actualizar la cuenta de servicio con otras API. Una vez creado, no se puede cambiar.

También proporciona los siguientes valores:

  • [SA-DESCRIPTION] es una descripción opcional de la cuenta de servicio.
  • [SA-DISPLAY-NAME] es un nombre descriptivo para la cuenta de servicio.
  • [PROJECT-ID] es el ID de tu proyecto de Google Cloud.

Para crear una cuenta de servicio, como mínimo, se debe otorgar al usuario la función de administrador de cuentas de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige tu proyecto y haz clic en Abrir.

  3. Haz clic en Crear cuenta de servicio.

  4. Ingresa un nombre de cuenta de servicio (un nombre comercial descriptivo), una descripción opcional, selecciona la función que deseas otorgar a la cuenta de servicio y, luego, haz clic en Guardar.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts create para crear una cuenta de servicio.

Comando:

gcloud iam service-accounts create [SA-NAME] \
        --description "[SA-DESCRIPTION]" \
        --display-name "[SA-DISPLAY-NAME]"
    

El resultado incluye el nombre de la cuenta de servicio:

Created service account [SA-NAME].
    

API de REST

Llama a serviceAccounts.create() para crear una cuenta de servicio.

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts
    

El cuerpo de la solicitud debe contener las propiedades de la cuenta de servicio.

{
        "accountId": "[SA-NAME]",
        "serviceAccount": {
            "description": "[SA-DESCRIPTION]",
            "displayName": "[SA-DISPLAY-NAME]"
        }
    }
    

Respuesta:

{
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "113948692397867021414",
        "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "description": "SA-DESCRIPTION",
        "displayName": "SA-DISPLAY-NAME",
        "etag": "BwUp3rVlzes=",
        "oauth2ClientId": "117249000288840666939"
    }
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 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 {
          ServiceAccount serviceAccount = new ServiceAccount();
          serviceAccount.setDisplayName("your-display-name");
          CreateServiceAccountRequest request = new CreateServiceAccountRequest();
          request.setAccountId("your-service-account-name");
          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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Después de crear una cuenta de servicio, otorga una o más funciones a la cuenta de servicio para que pueda actuar en tu nombre.

Cómo listar cuentas de servicio

Cuando se enumeran las cuentas de servicio, puedes especificar parámetros para limitar la cantidad de cuentas de servicio que se incluirán en la respuesta. Luego, puedes usar ListServiceAccountsResponse.next_page_token en una solicitud posterior para enumerar las cuentas de servicio restantes.

Usa este método para auditar cuentas y claves de servicio o crear herramientas personalizadas con el fin de administrar cuentas de servicio.

Para enumerar cuentas de servicio, como mínimo, se debe otorgar al usuario la función de usuario de cuenta de servicio (roles/iam.serviceAccountUser) o la función básica de visualizador (roles/viewer).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona tu proyecto y haz clic en Open. Todas las cuentas de servicio se encuentran en una lista en la página Cuentas de servicio.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts list para crear una lista de todas las cuentas de servicio de un proyecto.

Comando:

gcloud iam service-accounts list
    

El resultado es la lista de todas las cuentas de servicio en el proyecto:

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 de REST

Llama al método serviceAccounts.list().

Solicitud:

GET https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts
    

Respuesta:

{
        "accounts": [
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
            "projectId": "PROJECT-ID",
            "uniqueId": "108979773878059201436",
            "email": "SA-NAME-1@PROJECT-ID.iam.gserviceaccount.com",
            "description": "SA-DESCRIPTION-1",
            "displayName": "SA-DISPLAY-NAME-1",
            "etag": "BwUpTsLVUkQ=",
            "oauth2ClientId": "102240834887833340852"
        },
        {
            "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
            "projectId": "PROJECT-ID",
            "uniqueId": "108979773878059201436",
            "email": "SA-NAME-2@PROJECT-ID.iam.gserviceaccount.com",
            "description": "SA-DESCRIPTION-2",
            "displayName": "SA-DISPLAY-NAME-2",
            "etag": "BwUpTsLVUkQ=",
            "oauth2ClientId": "102240834887833340852"
        }]
    }
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

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

Actualiza una cuenta de servicio

Se suele usar el nombre comercial (nombre descriptivo) y la descripción de una cuenta de servicio para recopilar información adicional sobre esta, como el propósito de la cuenta de servicio o una persona de contacto de la cuenta.

Para actualizar el nombre o la descripción de una cuenta de servicio, se debe otorgar como mínimo al usuario la función de administrador de cuentas de servicio (roles/iam.serviceAccountAdmin) o la función básica editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige tu proyecto y haz clic en Abrir.

  3. Busca la cuenta de servicio a la que quieres cambiarle el nombre, haz clic en el de esa fila y, luego, haz clic en Editar..

  4. Ingresa el nuevo nombre y haz clic en Guardar.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts update para actualizar una cuenta de servicio.

Comando:

gcloud iam service-accounts update \
        [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com \
        --description "[UPDATED-SA-DESCRIPTION]" \
        --display-name "[UPDATED-DISPLAY-NAME]"
    

El resultado es la cuenta de servicio renombrada:

description: Updated description
    displayName: Updated display name
    name: projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

API de REST

Usa el método serviceAccounts.patch().

Solicitud:

PATCH https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

El cuerpo de la solicitud debe contener el correo electrónico de la cuenta de servicio y el nombre comercial o la descripción nuevos.

{
        "serviceAccount": {
            "email": "[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com",
            "displayName": "[UPDATED-DISPLAY-NAME]",
            "description": "[UPDATED-DESCRIPTION]"
        },
        "updateMask": "displayName,description"
    }
    

Respuesta:

{
        "name": "projects/PROJECT-ID/serviceAccounts/SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "projectId": "PROJECT-ID",
        "uniqueId": "107522985251862639552",
        "email": "SA-NAME@PROJECT-ID.iam.gserviceaccount.com",
        "description": "SA-DESCRIPTION",
        "displayName": "Updated display name",
        "etag": "BwUqLK4bL9U=",
        "oauth2ClientId": "105236325228757713905"
    }
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 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 {
          // First, get a service account using List() or Get()
          ServiceAccount serviceAccount =
              service
                  .projects()
                  .serviceAccounts()
                  .get(
                      "projects/-/serviceAccounts/"
                          + "your-service-account-name@"
                          + projectId
                          + ".iam.gserviceaccount.com")
                  .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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Cómo inhabilitar una cuenta de servicio

Al igual que cuando borras una cuenta de servicio, cuando inhabilitas una de estas, las aplicaciones ya no tendrán acceso a los recursos de Google Cloud a través de esa cuenta de servicio. Si inhabilitas las cuentas de servicio predeterminadas de App Engine y Compute Engine, las instancias ya no tendrán acceso a los recursos del proyecto. Si intentas inhabilitar una cuenta de servicio que ya está inhabilitada, no tendrá efecto.

A diferencia de las cuentas de servicio borradas, las cuentas de servicio inhabilitadas se pueden volver a habilitar de forma sencilla según sea necesario. Te recomendamos inhabilitar la cuenta de servicio antes de borrarla para asegurarte de que ninguna aplicación importante esté usando la cuenta.

Para inhabilitar una cuenta de servicio, como mínimo, se debe otorgar al usuario la función de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige tu proyecto y haz clic en Abrir.

  3. Haz clic en el nombre de la cuenta de servicio que quieres inhabilitar.

  4. En Estado de la cuenta de servicio, haz clic en Inhabilitar cuenta de servicio y, luego, haz clic en Inhabilitar para confirmar el cambio.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts disable para inhabilitar una cuenta de servicio.

Comando:

gcloud iam service-accounts disable [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

Resultado:

Disabled service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

API de REST

Usa el método serviceAccounts.disable().

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com:disable
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 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 {
          DisableServiceAccountRequest request = new DisableServiceAccountRequest();
          service
              .projects()
              .serviceAccounts()
              .disable(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  request)
              .execute();

          System.out.println(
              "Disabled service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } 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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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)

Cómo habilitar una cuenta de servicio

Después de habilitar una cuenta de servicio inhabilitada, las aplicaciones recuperarán el acceso a los recursos de Google Cloud a través de esta cuenta.

Puedes habilitar una cuenta de servicio inhabilitada siempre que lo necesites. Si intentas habilitar una cuenta de servicio ya habilitada, no tendrá efecto.

Para habilitar una cuenta de servicio, como mínimo, se debe otorgar al usuario la función de administrador de cuenta de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige tu proyecto y haz clic en Abrir.

  3. Haz clic en el nombre de la cuenta de servicio que deseas habilitar.

  4. En Estado de la cuenta de servicio, haz clic en Habilitar cuenta de servicio y, luego, haz clic en Habilitar para confirmar el cambio.

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts enable para habilitar una cuenta de servicio.

Comando:

gcloud iam service-accounts enable [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

Resultado:

Enabled service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

API de REST

Usa el método serviceAccounts.enable().

POST https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com:enable
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 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 {
          EnableServiceAccountRequest request = new EnableServiceAccountRequest();
          service
              .projects()
              .serviceAccounts()
              .enable(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com",
                  request)
              .execute();

          System.out.println(
              "Enabled service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } 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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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("Disabled service account :" + email)

Cómo borrar una cuenta de servicio

Cuando borras una cuenta de servicio, las aplicaciones ya no tendrán acceso a los recursos de Google Cloud a través de esa cuenta. Si borras las cuentas de servicio predeterminadas de App Engine y Compute Engine, las instancias ya no tendrán acceso a los recursos del proyecto.

Borra con precaución y asegúrate de que tus aplicaciones importantes ya no usen la cuenta de servicio antes de borrarla. Si no tienes en claro si se está usando una cuenta de servicio, te recomendamos que inhabilites la cuenta de servicio antes de borrarla. Las cuentas de servicio inhabilitadas se pueden volver a habilitar con facilidad si aun están en uso.

Cuando se borra una cuenta de servicio, sus vinculaciones de función no se quitan de forma inmediata, sino que se borran definitivamente del sistema de manera automática después de un máximo de 60 días.

Para borrar una cuenta de servicio, como mínimo, se debe otorgar al usuario la función de administrador de cuentas de servicio (roles/iam.serviceAccountAdmin) o la función básica de editor (roles/editor).

Console

  1. Abre la página Cuentas de servicio en Cloud Console.

    Abrir la página Cuentas de servicio

  2. Haz clic en Seleccionar un proyecto, elige un proyecto y haz clic en Abrir.

  3. Selecciona las cuentas de servicio que deseas borrar y, luego, haz clic en Borrar .

Comando de gcloud

Ejecuta el comando gcloud iam service-accounts delete para borrar una cuenta de servicio.

Comando:

gcloud iam service-accounts delete \
      [SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

Resultado:

Deleted service account SA-NAME@PROJECT-ID.iam.gserviceaccount.com
    

API de REST

Usa el método serviceAccounts.delete().

DELETE https://iam.googleapis.com/v1/projects/[PROJECT-ID]/serviceAccounts/[SA-NAME]@[PROJECT-ID].iam.gserviceaccount.com
    

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go que se encuentran en la Guía de inicio rápido con bibliotecas cliente de Cloud IAM. Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    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 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 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 {
          service
              .projects()
              .serviceAccounts()
              .delete(
                  "projects/-/serviceAccounts/"
                      + "your-service-account-name@"
                      + projectId
                      + ".iam.gserviceaccount.com")
              .execute();

          System.out.println(
              "Deleted service account: "
                  + "your-service-account-name@"
                  + projectId
                  + ".iam.gserviceaccount.com");
        } 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
        GoogleCredential credential =
            GoogleCredential.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(),
                    credential)
                .setApplicationName("service-accounts")
                .build();
        return service;
      }
    }

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para 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)

Después de borrar una cuenta de servicio, no crees una cuenta de servicio nueva con el mismo nombre. Esto puede dar como resultado un comportamiento inesperado. Para obtener más información, consulta Cómo borrar y volver a crear cuentas de servicio.

Cómo recuperar una cuenta de servicio

En algunos casos, puedes usar el comando undelete para recuperar una cuenta de servicio borrada. Por lo general, puedes recuperar una cuenta de servicio borrada si cumple con los criterios siguientes:

  • La cuenta de servicio se borró hace menos de 30 días.

    Después de 30 días, Cloud IAM quitará la cuenta de servicio de forma permanente. Google Cloud no puede recuperar la cuenta de servicio después de que se quita de forma permanente, incluso si presentas una solicitud de asistencia.

  • No existe una cuenta de servicio con el mismo nombre que la cuenta de servicio borrada.

    Por ejemplo, supongamos que borras la cuenta de servicio my-service-account@project-id.iam.gserviceaccount.com por accidente. Aún necesitas una cuenta de servicio con ese nombre, por lo que debes crear una cuenta de servicio nueva con el mismo nombre, my-service-account@project-id.iam.gserviceaccount.com.

    La nueva cuenta de servicio no hereda los permisos de la cuenta de servicio que se borró. En efecto, es completamente independiente de la cuenta de servicio que se borró. Sin embargo, no puedes recuperar la cuenta de servicio original porque la cuenta de servicio nueva tiene el mismo nombre.

    Para solucionar este problema, borra la cuenta de servicio nueva y, luego, intenta recuperar la cuenta original.

Cómo buscar el ID numérico de la cuenta de servicio

Cuando recuperas una cuenta de servicio, debes proporcionar su ID numérico. El ID numérico es un número de 21 dígitos, como 123456789012345678901, que identifica de forma única la cuenta de servicio. Por ejemplo, si borras una cuenta de servicio y, luego, creas una nueva con el mismo nombre, la original y la nueva tendrán ID numéricos diferentes.

A fin de buscar el ID numérico de una cuenta de servicio borrada, puedes buscar los registros de auditoría para operaciones de DeleteServiceAccount:

  1. Ve a la página Visor de registros en Cloud Console.

    Ir al Visor de registros

  2. En el cuadro de búsqueda que se encuentra cerca de la parte superior de la página, haz clic en la flecha de expansión arrow_drop_down y selecciona Convertir en filtro avanzado.

  3. En el cuadro de búsqueda, ingresa la siguiente consulta y reemplaza [SERVICE_ACCOUNT_NAME] por el nombre de tu cuenta de servicio (por ejemplo, my-service-account@project-id.iam.gserviceaccount.com):

    resource.type="service_account"
        resource.labels.email_id="[SERVICE_ACCOUNT_NAME]"
        "DeleteServiceAccount"
        
  4. Si la cuenta de servicio se borró hace más de una hora, selecciona la lista desplegable schedule Última hora y, luego, selecciona un período más largo.

    Si la cuenta de servicio se borró hace más de 7 días, selecciona Sin límite.

  5. Haz clic en Enviar filtro. El visor de registros muestra las operaciones DeleteServiceAccount que afectaron a las cuentas de servicio con el nombre que especificaste. El ID numérico de cada cuenta de servicio aparece junto al texto DeleteServiceAccount.

    Si los resultados de la búsqueda incluyen solo una operación DeleteServiceAccount, toma nota del ID numérico. Deberá usar el ID numérico para recuperar la cuenta de servicio.

    Si hay más de un resultado de la búsqueda, haz clic en la flecha de expansión arrow_right junto a un resultado de la búsqueda. Revisa los detalles de la entrada de registro y determina si muestra la operación que quieres deshacer. Repite este proceso hasta que encuentres la entrada de registro correcta y, luego, toma nota del ID numérico de esa entrada.

Cómo recuperar la cuenta de servicio por ID numérico

Después de encontrar el ID numérico de la cuenta de servicio borrada, puedes intentar recuperar la cuenta de servicio.

Comando de gcloud

Ejecuta el comando gcloud beta iam service-accounts undelete para recuperar una cuenta de servicio.

Comando:

gcloud beta iam service-accounts undelete [ACCOUNT_ID]
    

Resultado:

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 de REST

Usa el método serviceAccounts.undelete(). Reemplaza [ACCOUNT_UNIQUE_ID] por el ID numérico de la cuenta de servicio.

POST https://iam.googleapis.com/v1/projects/-/serviceAccounts/[ACCOUNT_UNIQUE_ID]:undelete
    

Si la cuenta se puede recuperar, recibirás un código de respuesta 200 OK con detalles sobre la cuenta de servicio restablecida.

Próximos pasos