Exporta una imagen personalizada a Cloud Storage

Si necesitas mover los datos del disco de arranque de Compute Engine fuera del proyecto de Compute Engine, puedes exportar una imagen de disco de arranque a Cloud Storage como un archivo tar.gz. Si necesitas crear una imagen de disco persistente para usarla cuando crees discos persistentes nuevos en Compute Engine, consulta la sección Crea una imagen personalizada.

Puedes exportar una imagen personalizada como copia de seguridad o para compartir mediante la exportación de la imagen a Cloud Storage. Este método es ideal para compartir imágenes individuales con otros proyectos que no tienen acceso a tus imágenes. De forma alternativa, puedes compartir imágenes si otorgas la Función del usuario de imágenes de Compute Engine en la imagen o en el proyecto que la contiene.

En el diagrama siguiente, se muestran algunos flujos de trabajo típicos para la creación y reutilización de una imagen personalizada.

Crea y reutiliza imágenes personalizadas.
Figura 1. Ejemplos de creación y reutilización de imágenes personalizadas

Antes de comenzar

Habilita la API de Cloud Build

La herramienta de exportación de dispositivos virtuales usa Cloud Build.

En la mayoría de los casos, gcloud compute images export intenta otorgar estos permisos a la cuenta de servicio de Cloud Build. Sin embargo, puedes otorgarlos de forma manual para asegurarte de que los permisos obligatorios estén en vigor.

Console

  1. En Google Cloud Console, habilita la API de Cloud Build.

    Habilita la API de Cloud Build

    Cuando habilitas la API de Cloud Build desde la consola, Compute Engine otorga las siguientes funciones a la cuenta de servicio de Cloud Build para que el servicio de Cloud Build pueda exportar instancias desde Compute Engine:

    • roles/iam.serviceAccountTokenCreator
    • roles/compute.admin
    • roles/iam.serviceAccountUser

    La herramienta de exportación también usa la cuenta de servicio predeterminada de Compute Engine. De forma predeterminada, la cuenta de servicio de Compute Engine tiene la función de editor de proyectos de Cloud IAM. Si se quita esta función, es posible que el proceso de exportación falle. Para volver a agregar la función a la cuenta de servicio, consulta la página sobre cómo otorgar acceso. Para obtener más información sobre la cuenta de servicio predeterminada de Compute Engine, consulta Cuenta de servicio predeterminada de Compute Engine.

gcloud

Para configurar el servicio Cloud Build mediante la herramienta de línea de comandos de gcloud, completa los siguientes pasos:

  1. Habilita Cloud Build con la herramienta de línea de comandos de gcloud.

    gcloud services enable cloudbuild.googleapis.com

    La herramienta de exportación también usa la cuenta de servicio predeterminada de Compute Engine. De forma predeterminada, la cuenta de servicio de Compute Engine tiene la función de editor de proyectos de Cloud IAM. Si se quita esta función, es posible que el proceso de exportación falle. Para volver a agregar la función a la cuenta de servicio, consulta la página sobre cómo otorgar acceso. Para obtener más información sobre la cuenta de servicio predeterminada de Compute Engine, consulta Cuenta de servicio predeterminada de Compute Engine.

  2. Agrega la función compute.admin a la cuenta de servicio para la API de Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. Agrega la función iam.serviceAccountUser a la cuenta de servicio para la API de Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. Agrega la función iam.serviceAccountTokenCreator a la cuenta de servicio para la API de Cloud Build.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountTokenCreator
    

    Reemplaza los siguientes elementos:

Exporta una imagen con un solo comando

La forma preferida de exportar una imagen a Cloud Storage es utilizar el comando gcloud compute images export. Este comando usa Daisy a fin de encadenar los diversos pasos necesarios para exportar una imagen. Se supone que ya creaste una imagen, por ejemplo, con el comando gcloud compute images create.

Con la herramienta de línea de comandos de gcloud, ejecuta lo siguiente:

gcloud compute images export \
    --destination-uri destination-uri \
    --image image-name

Reemplaza los siguientes elementos:

  • destination-uri: El destino del URI de Cloud Storage para el archivo de disco virtual exportado.
  • image-name: El nombre de la imagen de disco que se exportará.

Por ejemplo, el siguiente comando exporta una imagen llamada my-image de my-project a un depósito de Cloud Storage llamado my-bucket. De forma predeterminada, la imagen se exporta como un archivo disk.raw y se comprime en el formato de archivo tar.gz.

gcloud compute images export \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image \
    --project my-project

Para obtener una lista de todas las marcas disponibles, consulta la documentación de referencia gcloud compute images export.

Crea y exporta una imagen de forma manual

Si los comandos gcloud compute images create y gcloud compute images export no cumplen con tus requisitos, puedes crear y exportar una imagen manualmente desde una instancia de Compute Engine. Este proceso tiene pasos discretos a fin de crear primero una imagen y, luego, exportarla.

En el ejemplo siguiente, ten en cuenta que el disco creado se llama image-disk.

Si quieres crear y exportar una imagen, sigue estos pasos:

  1. De forma opcional, puedes detener la instancia a la que conectaste el disco antes de crear la instantánea. Si detienes la instancia, se garantiza la integridad del contenido del disco en la instantánea. Reemplaza disk-name por el nombre del disco que deseas usar para crear la instantánea.

  2. Crea una instantánea del disco. Asigna un nombre a la instantánea image-snapshot.

    gcloud compute disks snapshot disk-name \
        --snapshot-names image-snapshot
  3. Usa la instantánea image-snapshot para crear un disco nuevo llamado image-disk. Para ello, ejecuta el siguiente comando:

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. Crea un disco temporal llamado temporary-disk para contener el archivo tar y especifica que el size del disco sea al menos un 50% más grande que el disco de imagen.

    Después podrás desvincular y borrar el disco.

    gcloud compute disks create temporary-disk \
        --size size

    en el que size es el tamaño, en gigabytes o terabytes, del disco temporal. Por ejemplo, especifica 100GB si quieres crear un disco de 100 gigabytes.

  5. Crea una instancia y habilita el alcance storage-rw en ella. Además, adjunta image-disk y temporary-disk a la instancia como discos secundarios con atributos device-name específicos. Reemplaza instance-name por el nombre de la instancia que deseas crear.

    gcloud compute instances create instance-name \
        --scopes storage-rw \
        --disk name=image-disk,device-name=image-disk \
        --disk name=temporary-disk,device-name=temporary-disk

    Ten en cuenta que estás transfiriendo alcances de cuentas de servicio para poder subir el archivo a Cloud Storage en pasos posteriores.

    Consulta los detalles sobre cómo iniciar una instancia nueva si es necesario.

  6. Conéctate a tu instancia: Reemplaza instance-name por el nombre de la instancia a la que deseas conectarte.

    gcloud compute ssh instance-name
  7. Formatea y activa el disco temporal: Si se formatea el disco, se borran los contenidos del disco temporal.

    sudo mkdir /mnt/tmp
    sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
    sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
  8. De forma opcional, puedes activar el disco de imagen y realizar cambios adicionales antes de crear el archivo tar. Por ejemplo, es posible que quieras borrar los archivos existentes del directorio /home si no deseas que formen parte de la imagen. Debes activar las particiones del disco que necesitas modificar, modificar los archivos en el disco que necesitas cambiar y, luego, desactivar el disco cuando hayas terminado.

    1. Crea un directorio en el que puedas activar tu disco o partición.

      sudo mkdir /mnt/image-disk
    2. Usa el comando ls para determinar qué disco o partición de disco necesitas activar.

      ls /dev/disk/by-id/

      Con el comando, se imprime una lista del ID del disco y las particiones. Por ejemplo, el disco siguiente tiene una tabla particionada con una partición. El ID google-image-disk apunta al disco completo desde el que quieres crear una imagen. El ID de google-image-disk-part1 apunta a la primera partición en este disco. Debes activar la partición si necesitas realizar cambios en el disco; luego, crea la imagen desde el disco completo.

      google-image-disk
      google-image-disk-part1
      
    3. Activa el disco o la partición. Si tu disco tiene una tabla particionada, debes activar las particiones individuales de tu disco. Por ejemplo, activa google-image-disk-part1.

      sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk

      De forma alternativa, si tu disco tiene un formato sin procesar y sin tabla de particiones, activa el disco google-image-disk completo.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Modifica los archivos en el directorio /mnt/image-disk para configurar los archivos en el disco. Por ejemplo, puedes quitar el archivo /mnt/image-disk/home/[USER]/.ssh/authorized_keys para evitar que se compartan las Llaves SSH.

    5. Una vez que hayas terminado de modificar los archivos, desactiva el disco.

      sudo umount /mnt/image-disk/
  9. Crea el archivo tar de la imagen.

    Cuando termines de personalizar los archivos en el disco de imagen, crea un archivo de disco sin procesar en tu disco temporal. El nombre de la imagen de disco sin procesar debe ser “disk.raw”:

     sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096

    Luego, debes convertir este archivo en formato tar y gzip:

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    Con este comando, se crea una imagen de la instancia en la siguiente ubicación:

    /mnt/tmp/myimage.tar.gz

  10. Sube la imagen a Cloud Storage.

    Para subir el archivo tar en Cloud Storage, usa la herramienta de línea de comandos de gsutil que viene preinstalada en tu instancia.

    1. Crea un depósito con gsutil.

      Asegúrate de revisar los lineamientos de asignación de nombres de objetos y depósitos antes de crear el depósito. Luego, crea el depósito con el siguiente comando: Reemplaza bucket-name por el nombre del depósito que deseas crear.

      me@example-instance:~$ 
      gsutil mb gs://bucket-name
    2. Copia el archivo en el depósito nuevo. Reemplaza bucket-name por el nombre del depósito en el cual se copiará el archivo.

      me@example-instance:~$ 
      gsutil cp /mnt/tmp/myimage.tar.gz gs://bucket-name

Exportaste tu archivo a Cloud Storage. Ahora puedes compartir la imagen con otras personas o usar el archivo tar para agregar una imagen nueva a un proyecto de Google Cloud Console.

Próximos pasos