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 crear una copia de seguridad o compartir una imagen personalizada si exportas la imagen a Cloud Storage. Este método es ideal para compartir imágenes individuales con 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.

    Habilitar 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 Otorga 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 Otorga 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 la siguiente información:

Exporta una imagen con un solo comando

gcloud

El método de preferencia para exportar una imagen a Cloud Storage es usar el comando gcloud compute images export. Este comando usa Daisy a fin de encadenar los diversos pasos necesarios para exportar una imagen. Se da por sentado 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 esto:

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

Reemplaza la siguiente información:

  • destination-uri por el destino del URI de Cloud Storage para el archivo de disco virtual exportado.
  • image-name por 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.

API

En la API, crea una solicitud POST a la API de Cloud Build.

    POST https://cloudbuild.googleapis.com/v1/projects/project-id/builds

    {
    "timeout": "timeout",
    "steps": [
     {
      "args": [
       "-timeout": "timeout",
       "-source_image=source-image",
       "-client_id=api",
       "-format=image-format",
       "-destination_uri=destination-uri"
      ],
      "name": "gcr.io/compute-image-tools/gce_vm_image_export:release",
      "env": [
       "BUILD_ID=$BUILD_ID"
      ]
     }
    ]
    }
    

Reemplaza la siguiente información:

  • project-id por el ID del proyecto que contiene la imagen que deseas exportar.
  • timeout por el tiempo máximo que debería durar una compilación antes de que falle con un mensaje TIMEOUT. En la API, la hora debe especificarse en segundos. Un valor de tiempo de espera de 7200s debería funcionar en la mayoría de los casos.
  • source-image por el nombre de la imagen que se exportará.
  • image-format por el formato de la imagen exportada. Los formatos válidos son vmdk, vhdx, vpc, vdi y qcow2.
  • destination-uri por la ubicación del URI de Cloud Storage en la que deseas exportar el archivo del disco virtual. Por ejemplo: gs://my-bucket/my-exported-image.vmdk.

Para obtener valores args adicionales que se puedan proporcionar, consulta la sección de marcas opcionales de la página sobre exportación de imágenes de VM en GitHub.

Respuesta de ejemplo

El resultado muestra una respuesta similar al siguiente ejemplo:

    {
    "name": "operations/build/myproject-12345/operation-1578608233418",
    "metadata": {
     "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
     "build": {
      "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
      "status": "QUEUED",
      "createTime": "2019-10-02T18:59:13.393492020Z",
      "steps": [
       {
        "name": "gcr.io/compute-image-tools/gce_vm_image_export:release",
        "env": [
         "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
        ],
        "args": [
         "-timeout=7056s",
         "-source_image=my-image",
         "-client_id=api",
         "-format=vmdk",
         "-destination_uri=gs://my-bucket/my-exported-image.vmdk"
        ]
       }
      ],
      "timeout": "7200s",
      "projectId": "myproject-12345",
      "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com",
      "options": {
       "logging": "LEGACY"
      },
      "logUrl": "https://console.cloud.google.com/gcr/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
     }
     }

Puedes supervisar tu compilación de las siguientes dos maneras:

  • Ejecuta una solicitud projects.builds.get con el build-id que se mostró.
  • Revisa los registros alojados en el logUrl proporcionado.

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 de forma manual 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 con el fin de 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 desconectar y borrar el disco.

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

    En el ejemplo anterior, 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 permiso storage-rw en ella. Además, conecta 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 permisos de cuentas de servicio para poder más adelante subir el archivo a Cloud Storage.

    De ser necesario, consulta Inicia una instancia nueva.

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

        gcloud compute ssh instance-name
  7. Da formato y activa el disco temporal: Si das formato al 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 el disco tiene una tabla particionada, debes activar las particiones individuales del 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 el disco tiene un formato sin procesar y no tiene una 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 el 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 la 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 el 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