Crea una VM que use una cuenta de servicio administrada por el usuario


En este documento, se explica cómo crear una instancia de máquina virtual (VM) configurada para usar una cuenta de servicio administrada por el usuario. Una cuenta de servicio es un tipo especial de cuenta que, por lo general, es usada por una carga de trabajo de aplicación o procesamiento para realizar llamadas autorizadas a la API.

Las cuentas de servicio son necesarias para situaciones en las que una carga de trabajo, como una aplicación personalizada, necesita acceder a los recursos de Google Cloud o realizar acciones sin la participación del usuario final. Si deseas obtener más información sobre cuándo usar las cuentas de servicio, consulta Prácticas recomendadas para usar cuentas de servicio.

Si tienes aplicaciones que necesitan realizar llamadas a las APIs de Google Cloud, Google recomienda que conectes una cuenta de servicio administrada por el usuario a la VM en la que se ejecuta la aplicación o la carga de trabajo. Luego, otorgas los roles de IAM de la cuenta de servicio, que otorga a la cuenta de servicio (y, por extensión, a las aplicaciones que se ejecutan en la VM) acceso a los recursos de Google Cloud.

Antes de comenzar

  • Configura la autenticación si aún no lo hiciste. La autenticación es el proceso mediante el cual se verifica tu identidad para acceder a los servicios y las API de Google Cloud. Para ejecutar un código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine de la siguiente manera.

    Selecciona la pestaña sobre cómo planeas usar las muestras en esta página:

    Consola

    Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud, no necesitas configurar la autenticación.

    gcloud

    1. Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init
    2. Configura una región y una zona predeterminadas.

    Terraform

    Para usar las muestras de Terraform de esta página desde un entorno de desarrollo local, instala e inicializa la CLI de gcloud y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Instala Google Cloud CLI.
    2. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

      gcloud init
    3. Crea credenciales de autenticación locales para tu Cuenta de Google:

      gcloud auth application-default login

    Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Instala Google Cloud CLI y, luego, inicializa la ejecución del siguiente comando:

      gcloud init

Funciones obligatorias

Para obtener los permisos que necesitas para crear VMs que usen cuentas de servicio, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:

Si quieres obtener más información para otorgar funciones, consulta Administra el acceso.

Estos roles predefinidos contienen los permisos necesarios para crear VMs que usen cuentas de servicio. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

Los siguientes permisos son necesarios para crear VMs que usen cuentas de servicio:

  • Para crear cuentas de servicio, haz lo siguiente: Todos los permisos del rol serviceAccountCreator
  • Para crear VMs, sigue estos pasos:
    • compute.instances.create en el proyecto
    • Para usar una imagen personalizada con el fin de crear la VM, sigue estos pasos: compute.images.useReadOnly en la imagen
    • Si deseas usar una instantánea para crear la VM, sigue estos pasos: compute.snapshots.useReadOnly en la instantánea
    • Para usar una plantilla de instancias a fin de crear la VM, haz lo siguiente: compute.instanceTemplates.useReadOnly en la plantilla de instancias
    • Para asignar una red heredada a la VM: compute.networks.use en el proyecto
    • Si deseas especificar una dirección IP estática para la VM; compute.addresses.use en el proyecto
    • Para asignar una dirección IP externa a la VM cuando se usa una red y punto heredado; compute.networks.useExternalIp en el proyecto
    • A fin de especificar una subred para la VM: compute.subnetworks.use en el proyecto o en la subred elegida
    • Para asignar una dirección IP externa a la VM cuando se usa una red de VPC, compute.subnetworks.useExternalIp en el proyecto o en la subred elegida
    • A fin de configurar los metadatos de la instancia de VM para la VM y los puntos, sigue estos pasos: compute.instances.setMetadata en el proyecto
    • A fin de configurar etiquetas para la VM y los puntos; compute.instances.setTags en la VM
    • Si deseas configurar etiquetas para la VM, haz lo siguiente: compute.instances.setLabels en la VM
    • A fin de configurar una cuenta de servicio para que la VM la usecompute.instances.setServiceAccount en la VM
    • Si deseas crear un disco nuevo para la VM: compute.disks.create en el proyecto
    • Para conectar un disco existente en modo de solo lectura o de lectura y escritura, haz lo siguiente: compute.disks.use en el disco
    • Para conectar un disco existente en modo de solo lectura y dos puntos, sigue estos pasos: compute.disks.useReadOnly en el disco

También puedes obtener estos permisos con funciones personalizadas o con otras funciones predefinidas

Descripción general

Se recomienda que configures las cuentas de servicio para las VMs de la siguiente manera:

  1. Crea una cuenta de servicio nueva administrada por el usuario en lugar de usar la cuenta de servicio predeterminada de Compute Engine y otórgale roles de IAM solo a los recursos y las operaciones que necesita.
  2. Conecta la cuenta de servicio a tu VM.
  3. Configura el permiso de la plataforma en la nube (https://www.googleapis.com/auth/cloud-platform) en tu VM. Esto permite que la cuenta de servicio de la VM llame a las APIs de Google Cloud que tiene permiso para usar.
    • Si especificas la cuenta de servicio con la consola de Google Cloud, el permiso de acceso de la VM se establece automáticamente en el permiso cloud-platform.
    • Si especificas la cuenta de servicio con Google Cloud CLI o la API de Compute Engine, puedes usar el parámetro scopes para configurar el permiso de acceso.

Configurar una cuenta de servicio

Crea una cuenta de servicio y asigna los roles de IAM necesarios. Asigna tantos roles de IAM como sea necesario. Puedes modificar los roles de IAM en tu cuenta de servicio según sea necesario.

Google recomienda que limites los privilegios de las cuentas de servicio y verifiques con regularidad los permisos de tu cuenta de servicio para asegurarte de que estén actualizados.

Usa uno de los siguientes métodos para configurar la cuenta de servicio.

Consola

    En la consola de Google Cloud, ve a la página Crear cuenta de servicio.

    Ve a Crear cuenta de servicio
  1. Elige tu proyecto.
  2. Ingresa un nombre en el campo Nombre de cuenta de servicio. La consola de Google Cloud completa el campo ID de cuenta de servicio en función de este nombre.

    Opcional: en el campo Descripción de la cuenta de servicio, ingresa una descripción. Por ejemplo, Service account for quickstart.

  3. Haz clic en Crear y continuar.
  4. Otorga los roles necesarios a la cuenta de servicio:

    Para otorgar un rol, busca la lista Selecciona un rol y, luego, selecciona el rol.

    Para otorgar roles adicionales, haz clic en Agregar otro rol y agrega cada rol adicional.

  5. Haga clic en Continuar.
  6. En el cuadro Rol de los usuarios de la cuenta de servicio, ingresa la dirección de correo electrónico de tu Cuenta de Google.
  7. Haz clic en Listo para terminar de crear la cuenta de servicio.

gcloud

    Configura la autenticación:

    1. Crea la cuenta de servicio:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Reemplaza SERVICE_ACCOUNT_NAME por un nombre para la cuenta de servicio.

    2. Para proporcionar acceso a tu proyecto y tus recursos, otorga un rol a la cuenta de servicio:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Reemplaza lo siguiente:

      • SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicio
      • PROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicio
      • ROLE: el rol a otorgar
    3. Para otorgar otro rol a la cuenta de servicio, ejecuta el comando como lo hiciste en el paso anterior.
    4. Otorga a tu Cuenta de Google un rol que te permita usar los roles de la cuenta de servicio y conectar la cuenta de servicio a otros recursos:

      gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com --member="user:USER_EMAIL" --role=roles/iam.serviceAccountUser

      Reemplaza lo siguiente:

      • SERVICE_ACCOUNT_NAME: el nombre de la cuenta de servicio
      • PROJECT_ID: el ID del proyecto en el que creaste la cuenta de servicio
      • USER_EMAIL: La dirección de correo electrónico de tu Cuenta de Google

Terraform

Para crear una cuenta de servicio, puedes usar el recurso google_service_account.

resource "google_service_account" "default" {
  account_id   = "service-account-id"
  display_name = "Service Account"
}

Recuerda reemplazar los valores de marcador de posición por los atributos account_id y display_name.

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Crea una VM y conecta la cuenta de servicio

Después de crear la cuenta de servicio, crea una VM y conecta la cuenta de servicio que creaste en la sección anterior. Establece también el permiso de acceso de la VM en cloud-platform.

Si ya tienes una VM existente y deseas configurarla para usar una cuenta de servicio diferente, consulta Cambia la cuenta de servicio conectada.

Usa uno de los siguientes métodos para crear una VM y conectar la cuenta de servicio.

Consola

  1. En la consola de Google Cloud, ve a la página Instancias de VM.

Ir a Instancias de VM

  1. Selecciona el proyecto y haz clic en Continuar.
  2. Haz clic en Crear instancia.
  3. Especifica un Nombre para la VM.
  4. Ve a la sección Identidad y acceso a la API.
  5. En la lista Cuenta de servicio, selecciona la cuenta de servicio que creaste. Cuando conectas una cuenta de servicio a una VM, el permiso de acceso cloud-platform del permiso de acceso de Google Cloud se establece de forma automática en la VM.
  6. Realiza personalizaciones de VM adicionales, según sea necesario.
  7. Para crear y, también, iniciar la VM, haz clic en Crear.

gcloud

Para crear una instancia de VM nueva y configurarla para usar una cuenta de servicio personalizada mediante Google Cloud CLI, usa el comando gcloud compute instances create y proporciona la cuenta de servicio correo electrónico y el permiso de acceso cloud-platform para la instancia de VM.

gcloud compute instances create VM_NAME \
    --service-account=SERVICE_ACCOUNT_EMAIL \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Reemplaza lo siguiente:

  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio que creaste. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com Para ver la dirección de correo electrónico, consulta Enumera cuentas de servicio.
  • VM_NAME: El nombre de la instancia de VM

Por ejemplo:

gcloud compute instances create example-vm \
    --service-account 123-my-sa@my-project-123.iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/cloud-platform

También puedes especificar el alcance mediante el alias: --scopes=cloud-platform. Solo la CLI de gcloud reconoce estos alias. La API y otras bibliotecas no reconocen estos alias, por lo que debes especificar el URI de alcance completo.

Terraform

Si deseas configurar una VM nueva para que use una cuenta de servicio, puedes usar el recurso google_compute_instance.

resource "google_compute_instance" "default" {
  name         = "my-test-vm"
  machine_type = "n1-standard-1"
  zone         = "us-central1-a"

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  // Local SSD disk
  scratch_disk {
    interface = "SCSI"
  }

  network_interface {
    network = "default"

    access_config {
      // Ephemeral public IP
    }
  }

  service_account {
    # Google recommends custom service accounts with `cloud-platform` scope with
    # specific permissions granted via IAM Roles.
    # This approach lets you avoid embedding secret keys or user credentials
    # in your instance, image, or app code
    email  = google_service_account.default.email
    scopes = ["cloud-platform"]
  }
}

REST

Usa el método instances.insert para crear la VM y especifica el correo electrónico de la cuenta de servicio y el permiso de acceso para la instancia de VM.

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
   "machineType":"zones/MACHINE_TYPE_ZONE/machineTypes/MACHINE_TYPE",
   "name":"VM_NAME",

   "disks":[
      {
         "initializeParams":{
            "sourceImage":"projects/IMAGE_PROJECT/global/images/IMAGE"
         },
         "boot":true
      }
   ],

   "networkInterfaces":[
      {
         "network":"global/networks/NETWORK_NAME"
      }
   ],

  "serviceAccounts": [
      {
      "email": "SERVICE_ACCOUNT_EMAIL",
      "scopes": ["https://www.googleapis.com/auth/cloud-platform"]
      }
   ],
   "shieldedInstanceConfig":{
      "enableSecureBoot":"ENABLE_SECURE_BOOT"
   }
}

Reemplaza lo siguiente:

  • PROJECT_ID: ID del proyecto en el que se creará la VM
  • ZONE: Zona en la que se creará la VM
  • MACHINE_TYPE_ZONE: Zona que contiene el tipo de máquina que se usará para la VM nueva
  • MACHINE_TYPE: El tipo de máquina, predefinido o personalizado de la VM nueva
  • VM_NAME: Nombre de la VM nueva
  • IMAGE_PROJECT: El proyecto que contiene la imagen
    Por ejemplo, si especificas debian-10 como familia de imágenes, especifica debian-cloud como proyecto de imagen.
  • IMAGE or IMAGE_FAMILY: Especifica una de las siguientes opciones:
    • IMAGE: Una versión específica de una imagen pública
      Por ejemplo, "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20200309"
    • IMAGE_FAMILY: Una familia de imágenes
      Esto crea la VM a partir de la imagen de SO no obsoleta más reciente. Por ejemplo, si especificas "sourceImage": "projects/debian-cloud/global/images/family/debian-10", Compute Engine crea una VM a partir de la última versión de la imagen de SO en la familia de imágenes Debian 10.
  • NETWORK_NAME: La red de VPC que deseas usar para la VM. Puedes especificar default para usar tu red predeterminada
  • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio que creaste. Por ejemplo: my-sa-123@my-project-123.iam.gserviceaccount.com. Para ver la dirección de correo electrónico, consulta Obtén un correo electrónico de cuenta de servicio.
  • ENABLE_SECURE_BOOT: Opcional: Si eliges una imagen que admite funciones de VM protegida, Compute Engine habilita de forma predeterminada el módulo virtual de plataforma de confianza (vTPM) y la supervisión de la integridad. Compute Engine no habilita el Inicio seguro de forma predeterminada.

    Si especificas true para enableSecureBoot, Compute Engine crea una VM con las tres funciones de VM protegida habilitadas. Después de que Compute Engine inicie la VM, debes detenerla para modificar las opciones de VM protegida.

Accede a otros servicios de Google Cloud y úsalos

Después de que tu VM esté configurada para usar la cuenta de servicio, las aplicaciones pueden usar la cuenta de servicio para autenticarse. El método más común es autenticarse mediante el uso de credenciales predeterminadas de la aplicación y una biblioteca cliente. Algunas herramientas de Google Cloud, como la CLI de gcloud y gsutil, pueden usar de forma automática la cuenta de servicio para acceder a las API de Google Cloud desde una VM. Para obtener más información, consulta Autentica cargas de trabajo con cuentas de servicio.

Si se borra 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. 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 si aún son necesarias.

Ejemplo: Accede a los recursos de Cloud Storage desde tu VM

Después de configurar tu VM para usar una cuenta de servicio que tenga el rol storage.admin, puedes usar herramientas como la CLI de gcloud y gsutil para administrar los archivos que almacenaste. Cloud Storage Para acceder a tus recursos de Cloud Storage, completa los siguientes pasos:

  1. Asegúrate de que la cuenta de servicio conectada a tu VM tenga el rol roles/storage.admin.

  2. Si tu VM usa una imagen de SO personalizada, instala la CLI de gcloud. De forma predeterminada, la CLI de gcloud está instalada en la mayoría de las imágenes de SO públicas que proporciona Google Cloud.

  3. Conéctate a la VM.

  4. Desde la VM, usa una de las siguientes herramientas para administrar tus recursos de Cloud Storage.

Próximos pasos