Comparte imágenes o instantáneas

Puedes compartir imágenes o instantáneas con usuarios fuera de la organización o del proyecto. Los usuarios con acceso de lectura a esos recursos pueden usarlos para completar operaciones en otros proyectos y organizaciones. Por ejemplo, si le otorgas a un usuario el acceso de lectura para una imagen o instantánea en tu proyecto, puedes usar esos recursos a fin de crear discos persistentes en tus propios proyectos. Usa las funciones de IAM para compartir el acceso de lectura a las imágenes o instantáneas.

En algunas situaciones, es mejor que esos usuarios autorizados tengan acceso a estos recursos de almacenamiento solo cuando usan esos recursos dentro de la organización o de ciertos proyectos. Si quieres limitar los proyectos en los que los usuarios pueden usar tus imágenes o instantáneas para crear recursos, configura la restricción de uso de recursos de almacenamiento como una política de la organización.

Para obtener más información sobre las funciones de IAM, lee la documentación de IAM.

Para obtener información sobre las políticas de IAM al nivel de los recursos, las cuales te permiten otorgar acceso a recursos específicos como imágenes en lugar de a un proyecto completo, consulta Otorga acceso a los recursos de Compute Engine.

Antes de comenzar

Limitaciones

Compartir recursos de almacenamiento tiene las siguientes restricciones:

  • Puedes otorgarle funciones a allAuthenticatedUsers para permitir el acceso a imágenes o instantáneas, pero no puedes otorgarle funciones con allUsers para permitir el acceso a estos recursos.

  • Puedes establecer la restricción constraints/compute.storageResourceUseRestrictions solo a nivel de la organización.

  • Debes usar la API de Compute Engine para crear imágenes o instantáneas de recursos fuera del proyecto. Por ejemplo, puedes hacer referencia a imágenes o instantáneas en proyectos remotos cuando ejecutas métodos que requieren que especifiques una ruta a una imagen o instantánea. Estos son algunos ejemplos de estos métodos:

Comparte recursos de almacenamiento entre proyectos y organizaciones

Puedes compartir el acceso a imágenes o instantáneas con otros usuarios si les otorgas las siguientes funciones o permisos de IAM a nivel de recurso, proyecto, organización o carpeta.

  • Imágenes: la función roles/compute.imageUser o el permiso compute.images.useReadOnly
  • Instantáneas: la función roles/compute.storageAdmin o el permiso compute.snapshots.useReadOnly

Estas funciones y permisos te permiten compartir imágenes o instantáneas con otros miembros del equipo fuera del proyecto que posee las imágenes o instantáneas. Por ejemplo, la empresa podría tener un proyecto específico con imágenes calificadas que el resto de tu empresa pueda usar. Puedes otorgarles la función roles/compute.imageUser a nivel de proyecto a los miembros de tu equipo, lo que les permite usar estas imágenes en sus propios proyectos.

A fin de otorgar la función de uso compartido de imágenes, usa Google Cloud Console, la herramienta de línea de comandos de gcloud o la API. Para aprender a usar IAM, lee la documentación de IAM.

Console

  1. Dirígete a la página de IAM en Cloud Console.

    Ir a la página IAM

  2. Si se solicita, selecciona tu proyecto.
  3. Sigue estos pasos para agregar un usuario nuevo:
    1. Haz clic en Agregar, en la parte superior de la página.
    2. Proporciona una o más direcciones de correo electrónico de la cuenta a la que deseas otorgarle acceso.
    3. Otórgale una o más funciones al miembro.
      • Imágenes: selecciona Compute Engine > Usuario de imagen de Compute en el selector de funciones.
      • Instantáneas: selecciona Compute Engine > Administrador de almacenamiento de Compute en el selector de funciones.
  4. Guarda los cambios.

gcloud

Con la herramienta de línea de comandos de gcloud, agrega una vinculación a la política de Cloud IAM para la imagen o el proyecto de imagen. En el siguiente ejemplo, se agrega una vinculación al proyecto.

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member [MEMBER_TYPE]:[ACCOUNT] --role [ROLE]

En el ejemplo anterior, se ilustra lo siguiente:

  • [PROJECT_ID] es el ID del proyecto que contiene las imágenes que deseas compartir.
  • [MEMBER_TYPE] es el tipo de cuenta a la que le otorgas acceso. Por ejemplo, usa user para usuarios individuales, serviceAccount para una cuenta de servicio y group para un grupo de Google.
  • [ACCOUNT] es la dirección de correo electrónico de la cuenta a la que le otorgas esta función. Por ejemplo, para una cuenta de servicio, podría ser my-sa@my-project-123.iam.gserviceaccount.com.
  • [ROLE] es la función que deseas otorgarle al usuario. Para imágenes, especifica roles/compute.imageUser. Para instantáneas, especifica roles/compute.storageAdmin.

Por ejemplo, este comando le otorga la función roles/compute.imageUser a john@example.com para que pueda acceder a las imágenes de un proyecto llamado database-images:

gcloud projects add-iam-policy-binding database-images \
    --member user:john@example.com --role roles/compute.imageUser

API

En la API, realiza una solicitud POST a la siguiente URL, en la que [PROJECT_ID] es el ID del proyecto que contiene las imágenes que deseas compartir.

POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy

El cuerpo de la solicitud debe contener la lista de vinculaciones que deseas aplicarle al proyecto. La función debe ser parte de la vinculación. Como en el siguiente ejemplo:

{
   "policy": {
       "version": "0",
       "bindings": [
       {
           "role": "roles/compute.admin",
           "members": [
               "user:example@gmail.com"
           ]
       },
       {
           "role": "roles/compute.imageUser",
           "members": [
               "user:john@gmail.com"
           ]
       }
       ]
   }

}

Otórgale a un grupo administrado de instancias el acceso a las imágenes

Compute Engine te permite crear grupos de instancias, ya sean administrados o no administrados. Si creas un grupo administrado de instancias, Compute Engine usa la cuenta de servicio de las API de Google para llamar a la API de Compute Engine y realizar acciones relevantes relacionadas con el grupo, como volver a crear instancias en mal estado y actualizar instancias. Si deseas crear un grupo administrado de instancias con una imagen de otro proyecto, le puedes otorgar la función compute.imageUser a la cuenta de servicio de la API que pertenece al proyecto que crea el grupo administrado de instancias.

Por ejemplo, supongamos que el Proyecto A desea crear grupos administrados de instancias con imágenes que son propiedad del Proyecto B. El propietario del Proyecto B debe otorgarle la función compute.imageUser a la cuenta de servicio de las API de Google del Proyecto A en el Proyecto B. Esto le otorga a la cuenta la capacidad de usar las imágenes del Proyecto B para crear grupos administrados de instancias en el Proyecto A.

Después de otorgar la función compute.imageUser, puedes proporcionar la URL de la imagen específica cuando crees la plantilla de instancias para el grupo.

Sigue estos pasos para obtener el correo electrónico de la cuenta de servicio y otorgar acceso a la cuenta:

  1. Ve a la página de IAM en Cloud Console del proyecto en el que deseas crear grupos administrados de instancias.

    Ir a la página IAM

  2. Si se te solicita, selecciona tu proyecto de la lista.
  3. Busca la cuenta de servicio de las API de Google, que tiene la dirección de correo electrónico con el siguiente formato:

    [PROJECT_NUMBER]@cloudservices.gserviceaccount.com
    
  4. Toma nota de la dirección de correo electrónico anterior. A continuación, otórgale a la cuenta el acceso al proyecto que posee las imágenes.

    Console

    1. En Google Cloud Console, ve a la página de IAM del proyecto que contiene las imágenes a las que deseas tener acceso.

      Ir a la página IAM

    2. Selecciona el proyecto de la lista de proyectos.
    3. Haz clic en el botón Agregar para agregar un miembro nuevo.
    4. En la casilla Miembros, ingresa la dirección de correo electrónico de la cuenta de servicio.
    5. Expande la lista desplegable Funciones y selecciona Compute Engine > Usuario de imagen de Compute (Beta).
    6. Haz clic en Agregar para agregar la cuenta.

    gcloud

    Con la herramienta de línea de comandos de gcloud, agrega una vinculación a la política de Cloud IAM para la imagen o el proyecto de imagen. En el siguiente ejemplo, se agrega una vinculación a nivel de proyecto.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member serviceAccount:[SERVICE_ACCOUNT_EMAIL] --role roles/compute.imageUser

    En el ejemplo anterior, se ilustra lo siguiente:

    • [PROJECT_ID] es el ID del proyecto que contiene las imágenes que deseas compartir.
    • [SERVICE_ACCOUNT_EMAIL] es el correo electrónico de la cuenta de servicio.

    Por ejemplo:

    gcloud projects add-iam-policy-binding database-images \
        --member serviceAccount:123456789012@cloudservices.gserviceaccount.com  \
        --role roles/compute.imageUser

    API

    En la API, realiza una solicitud POST a la siguiente URL, en la que [PROJECT_ID] es el ID del proyecto que contiene las imágenes que deseas compartir.

    POST https://cloudresourcemanager.googleapis.com/v1/projects/$[PROJECT_ID]:setIamPolicy
    

    El cuerpo de la solicitud debe contener la lista de vinculaciones que deseas aplicarle al proyecto. La función roles/compute.imageUser debe ser parte de la vinculación. Por ejemplo:

    {
       "policy": {
           "version": "0",
           "bindings": [
           {
               "role": "roles/owner",
               "members": [
                   "user:example@gmail.com"
               ]
           },
           {
               "role": "roles/compute.imageUser",
               "members": [
                   "serviceAccount:123456789012@cloudservices.gservbiceaccount.com"
               ]
           }
           ]
       }
    }
    

Restringe el uso de las imágenes o instantáneas compartidas

Después de haber compartido imágenes o instantáneas con otros usuarios, puedes controlar dónde emplean esos recursos los usuarios. Establece la restricción constraints/compute.storageResourceUseRestrictions para definir los proyectos en los que los usuarios pueden usar sus recursos de almacenamiento.

Debes tener permiso para modificar las políticas de tu organización a fin de configurar estas restricciones. Por ejemplo, la función resourcemanager.organizationAdmin tiene permiso para establecer estas restricciones.

  1. Busca el ID de tu organización.

    gcloud organizations list
    
  2. Obtén la configuración de políticas existentes para la organización.

    gcloud beta resource-manager org-policies describe \
        compute.storageResourceUseRestrictions \
        --organization [ORGANIZATION_ID] > org-policy.yaml
    

    en la que [ORGANIZATION_ID] es el ID de la organización.

  3. Abre el archivo org-policy.yaml en un editor de texto y modifica la restricción compute.storageResourceUseRestrictions. Agrega las restricciones que necesites o quita las que ya no necesitas. Cuando termines de editar el archivo, guarda los cambios. Por ejemplo, puedes configurar la siguiente entrada de restricción en el archivo de políticas:

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/[ORGANIZATION_ID]
    
  4. Aplica el archivo policy.yaml a tu organización.

    gcloud beta resource-manager org-policies set-policy
    --organization [ORGANIZATION_ID] org-policy.yaml
    

    En el ejemplo anterior, [ORGANIZATION_ID] es el ID de la organización.

Cuando termines de configurar las restricciones en la política de la organización, prueba esas restricciones para asegurarte de que creen las limitaciones que necesites.

Usa imágenes de otro proyecto

Si alguien te otorgó la función compute.imageUser, puedes acceder a las imágenes del proyecto si especificas el proyecto de imagen en tus solicitudes. Por ejemplo, usa lo siguiente para obtener una lista de imágenes disponibles:

gcloud compute images list --project [IMAGE_PROJECT_ID]

Si quieres aprender a usar una imagen para crear recursos nuevos, como crear una instancia, lee Crea e inicia una instancia de VM.

Por ejemplo, el siguiente comando crea una instancia con una imagen llamada database-image-a del proyecto database-images:

gcloud compute instances create test-instance --image database-image-a --image-project database-images

Del mismo modo, puedes usar la imagen para crear discos persistentes. Para obtener información sobre cómo crear un disco a partir de una imagen, consulta Crea un disco de arranque persistente independiente a partir de una imagen.

Usa instantáneas de otro proyecto

Si alguien te otorgó la función compute.snapshots.useReadOnly para una instantánea en un proyecto determinado, puedes acceder a esa instantánea si especificas el ID del proyecto en tus solicitudes. Si alguien te otorgó la función compute.storageAdmin en un proyecto específico, puedes acceder a las instantáneas de ese proyecto si especificas el ID del proyecto en tus solicitudes. Por ejemplo, para obtener una lista de instantáneas disponibles en el proyecto [SNAPSHOT_PROJECT_ID], haz lo siguiente:

gcloud compute snapshots list --project [SNAPSHOT_PROJECT_ID]

Comparte instantáneas con usuarios en otros proyectos para mover los datos del disco entre proyectos.

Por ejemplo, para mover los datos del disco disk-1 en project-a a un disco nuevo disk-2 en project-b, sigue estos pasos. En este ejemplo, disk-1 se encuentra en la zona us-west2-a, y instance-1 en la zona us-west2-b.

gcloud

  1. Crea una instantánea del disk-1:

    gcloud --project project-a compute disks snapshot disk-1 --snapshot-names snapshot-1
    
  2. Crea un disco nuevo en project-b que se base en la instantánea:

    gcloud --project project-b beta compute disks create disk-2 --source-snapshot projects/project-a/global/snapshots/snapshot-1
    
  3. Adjunta el disco nuevo a la instancia instance-1 en project-b. El disco debe estar en la misma zona que la instancia:

    gcloud --project project-b compute instances attach-disk instance-1 --disk disk-2
    
  4. Activa el disco. Consulta los pasos del 5 al 7 de la sección sobre cómo formatear y activar un disco persistente.

API

  1. Crea una instantánea del disk-1 mediante una solicitud POST al método disks.createSnapshot.

    POST https://compute.googleapis.com/compute/v1/projects/project-a/zones/us-west2-a/disks/disk-1/createSnapshot
    
    {
     "name": "snapshot-1"
    }
    
  2. Crea un disco nuevo disk-2 en project-b que se base en la instantánea. Crea una solicitud POST para crear un disco persistente zonal con el método disks.insert.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/disks
    
    {
     "name": "disk-2",
     "sizeGb": [DISK_SIZE],
     "type": "zones/us-west2-b/diskTypes/[DISK_TYPE]"
     "sourceSnapshot": "projects/project-a/global/snapshots/snapshot-1"
    }
    

    En el ejemplo anterior, se ilustra lo siguiente:

    • [DISK_SIZE] es el tamaño en GB del disco nuevo.
    • [DISK_TYPE] es el tipo de disco persistente. Ya sea pd-standard o pd-ssd.
  3. Adjunta el disco nuevo a la instancia instance-1 en project-b. El disco debe estar en la misma zona que la instancia. Crea una solicitud POST para el método instances.attachDisk y, luego, incluye la URL en el disco persistente de la zona que acabas de crear.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/instances/instance-1/attachDisk
    
    {
     "source": "/compute/v1/projects/project-b/zones/us-west2-b/disks/disk-2"
    }
    
  4. Activa el disco. Consulta los pasos del 5 al 7 de la sección sobre cómo formatear y activar un disco persistente.

Próximos pasos