Exportar 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 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 el rol 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

Limitaciones y restricciones

Para los proyectos que están protegidos con los Controles del servicio de VPC, usa uno de los siguientes métodos:

  • exportar desde el mismo proyecto en el que reside la imagen
  • exportar la imagen de forma manual

Exporta una imagen con un solo comando

Exporta una imagen a Cloud Storage

Puedes exportar tus imágenes con la consola de Google Cloud, Google Cloud CLI o la API de Cloud Build.

Console

  1. En Google Cloud Console, ve a la página Imágenes.

    Ir a Imágenes

  2. Haz clic en el nombre de la imagen que deseas exportar para ir a la página de detalles de esa imagen. No puedes exportar imágenes públicas proporcionadas por Google. Solo puedes exportar imágenes que hayas creado o importado anteriormente.

  3. En la página de detalles de la imagen, haz clic en Exportar para abrir la página Exportar imagen.

  4. En la página Exportar imagen, selecciona el Formato de exportación de la imagen.

  5. Haz clic en Explorar para elegir la ubicación de Cloud Storage a la que deseas exportar.

  6. Elige una ubicación de Cloud Storage existente para exportar tu imagen. O bien, sigue las instrucciones para crear un bucket nuevo de Cloud Storage y, luego, asígnale un nombre.

  7. Una vez que elijas una ubicación de Cloud Storage, elige un nombre de archivo para la imagen exportada. Puedes usar el nombre de archivo predeterminado o puedes elegir uno propio.

  8. Después de elegir una ubicación de Cloud Storage y de ingresar un nombre de archivo para la imagen, haz clic en Seleccionar.

  9. En la página Exportar imagen, haz clic en Exportar. Después de que elijas Exportar, la consola de Google Cloud mostrará el Historial de exportación de imágenes, en el que podrás ver el proceso de exportación de la imagen. Para obtener más detalles sobre el proceso de exportación de imágenes, haz clic en ID de Cloud Build para ir a la página Detalles de exportación de imágenes, en la que podrás ver y descargar el registro de exportación de la imagen.

  10. Ve a la página Almacenamiento para acceder a la imagen que exportaste.

    Ir a Almacenamiento

gcloud

La forma preferida de exportar una imagen a Cloud Storage es mediante 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 Google Cloud CLI, ejecuta lo siguiente:

gcloud compute images export \
    --destination-uri DESTINATION_URI \
    --image IMAGE_NAME

Reemplaza lo siguiente:

  • DESTINATION_URI: El destino del URI de Cloud Storage para el archivo de imagen exportado.
  • IMAGE_NAME: El nombre de la imagen de disco que se exportará.

De forma predeterminada, las imágenes se exportan en el formato de Compute Engine, que es un archivo disk.raw que se comprimido y se comprime con gzip. Para exportar imágenes en otros formatos compatibles con la utilidad de imagen de disco QEMU, puedes usar la marca --export-format. Los formatos válidos incluyen vmdk, vhdx, vpc, vdi y qcow2.

Ejemplo

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 file 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 marcas, consulta la documentación de referencia de 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": "7200s",
  "steps":[
    {
      "args":[
        "-timeout=7000s",
        "-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"
      ]
    }
  ],
  "tags":[
    "gce-daisy",
    "gce-daisy-image-export"
  ]
}

Reemplaza lo siguiente:

  • PROJECT_ID por el ID del proyecto que contiene la imagen que deseas exportar.
  • SOURCE_IMAGE: Es el nombre de la imagen que se importará.
  • IMAGE_FORMAT: Es el formato de la imagen exportada. Los formatos válidos incluyen vmdk, vhdx, vpc, vdi y qcow2.
  • DESTINATION_URI: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo, gs://my-bucket/my-exported-image.vmdk

Para conocer otros valores args 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/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
 }
 }

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

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

Exporta una imagen desde un proyecto mediante una cuenta de servicio personalizada de Compute Engine

Durante una exportación de imagen, se crea una instancia de máquina virtual (VM) temporal en tu proyecto. Debe autenticarse la herramienta de exportación de imágenes en esta VM temporal.

Una cuenta de servicio es una identidad que se adjunta a una VM. Se puede acceder a los tokens de acceso a la cuenta de servicio a través del servidor de metadatos de instancia y usarlos para autenticar la herramienta de exportación de imágenes en la VM.

De forma predeterminada, el proceso de exportación usa el agente de servicio predeterminado de Compute Engine del proyecto. Sin embargo, si la cuenta de servicio predeterminada de Compute Engine está inhabilitada en tu proyecto o si quieres usar una cuenta de servicio de Compute Engine personalizada, debes crear una cuenta de servicio y especificarla para el proceso de exportación.

Puedes exportar tus imágenes mediante la Google Cloud CLI o la API de Cloud Build.

gcloud

  1. Crea una cuenta de servicio y asigna los roles mínimos. Si deseas obtener más información para crear cuentas de servicio, consulta Crea y administra cuentas de servicio.

    Como mínimo, la cuenta de servicio de Compute Engine especificada debe tener asignados los siguientes roles:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin

    Para obtener más información, consulta Otorga roles necesarios a la cuenta de servicio de Compute Engine.

  2. Usa el comando gcloud compute images export para exportar la imagen.

    gcloud compute images export \
        --destination-uri DESTINATION_URI \
        --image IMAGE_NAME \
        --compute-service-account SERVICE_ACCOUNT_EMAIL

    Reemplaza lo siguiente:

    • DESTINATION_URI: El destino del URI de Cloud Storage para el archivo de imagen exportado.
    • IMAGE_NAME: El nombre de la imagen de disco que se exportará.
    • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico asociada con la cuenta de servicio de Compute Engine creada en el paso anterior.

Ejemplo

Por ejemplo, con el siguiente comando, se exporta una imagen llamada my-image de my-project a un depósito de Cloud Storage llamado my-bucket con una cuenta de servicio que tiene el correo electrónico image-export-service-account@proj-12345.iam.gserviceaccount.com. 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 \
    --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
    

Para obtener marcas, consulta la documentación de referencia de gcloud compute images export.

API

  1. Crea una cuenta de servicio y asigna los roles mínimos. Si deseas obtener más información para crear cuentas de servicio, consulta Crea y administra cuentas de servicio.

    Como mínimo, la cuenta de servicio de Compute Engine especificada debe tener asignadas las siguientes funciones:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin

    Para obtener más información, consulta Otorga funciones necesarias a la cuenta de servicio de Compute Engine.

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

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "timeout": "7200s",
      "steps":[
        {
          "args":[
            "-timeout=7000s",
            "-source_image=SOURCE_IMAGE",
            "-client_id=api",
            "-format=IMAGE_FORMAT",
            "-destination_uri=DESTINATION_URI",
            "-compute_service_account=SERVICE_ACCOUNT_EMAIL"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "tags":[
        "gce-daisy",
        "gce-daisy-image-export"
      ]
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID por el ID del proyecto que contiene la imagen que deseas exportar.
    • SOURCE_IMAGE: Es el nombre de la imagen que se importará.
    • IMAGE_FORMAT: Es el formato de la imagen exportada. Los formatos válidos incluyen vmdk, vhdx, vpc, vdi y qcow2.
    • DESTINATION_URI: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo, gs://my-bucket/my-exported-image.vmdk
    • SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico asociada con la cuenta de servicio de Compute Engine creada en el paso anterior.

Para conocer otros valores args 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.

Exporta una imagen mediante la VPC compartida

Antes de exportar una imagen que use una VPC compartida, debes agregar la función compute.networkUser a la cuenta de servicio de Cloud Build. Para obtener más información, consulta Otorga funciones necesarias a la cuenta de servicio de Cloud Build.

Puedes exportar la imagen mediante la Google Cloud CLI o la API de Cloud Build.

gcloud

Usa el comando gcloud compute images export para exportar la imagen.

gcloud compute images export \
    --image IMAGE_NAME \
    --destination-uri DESTINATION_URI \
    --project PROJECT_ID \
    --network NETWORK \
    [--subnet SUBNET \]
    [--zone ZONE]

Reemplaza lo siguiente:

  • IMAGE_NAME: Es el nombre de la imagen que se exportará.
  • DESTINATION_URI: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen
  • PROJECT_ID: El ID del proyecto en el que se encuentra la imagen.
  • NETWORK: La ruta de acceso completa a una red de VPC compartida. Por ejemplo, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
  • SUBNET: La ruta de acceso completa a una subred de VPC compartida. Por ejemplo, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME

    Especificar este modo depende del modo de red de VPC.

    • Si la red de VPC usa el modo heredado, no especifiques una subred.
    • Si la red de VPC usa el modo automático, la especificación de la subred es opcional.
    • Si la red de VPC usa el modo personalizado, este campo debe especificarse.
  • ZONE: La zona que se usará para la exportación. Esta zona debe coincidir con la región de la subred. Por ejemplo, si SUBNET está en la región us-west1, la zona de exportación debe ser una de las siguientes: us-west1-a, us-west1-b o us-west1-c.

    En la mayoría de los casos, especificar una zona es opcional. Si se especifica SUBNET, se debe especificar la zona.

Por ejemplo, el siguiente comando exporta una imagen llamada example-image de my-project a un depósito de Cloud Storage llamado my-bucket. En este ejemplo, la red de nube privada virtual (my-shared-vp) usa una subred personalizada (my-custom-subnet). De forma predeterminada, la imagen se exporta como un archivo disk.raw y se comprime en el formato de archivo tar.gz.

Comando de muestra

gcloud compute images export \
    --image example-image \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --project my-project \
    --network projects/my-vpc-project/global/networks/my-shared-vpc \
    --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-custom-subnet \
    --zone us-west1-c
 

API

  1. Agrega la imagen a Cloud Storage.

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

    POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds
    {
      "timeout": "7200s",
      "steps":[
        {
          "args":[
            "-timeout=7000s",
            "-source_image=SOURCE_IMAGE",
            "-client_id=api",
            "-format=IMAGE_FORMAT",
            "-destination_uri=DESTINATION_URI",
            "-network=NETWORK",
            "-subnet=SUBNET",
            "-zone=ZONE"
          ],
          "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
          "env":[
            "BUILD_ID=$BUILD_ID"
          ]
        }
      ],
      "tags":[
        "gce-daisy",
        "gce-daisy-image-export"
      ]
    }
    

    Reemplaza lo siguiente:

    • PROJECT_ID por el ID del proyecto que contiene la imagen que deseas exportar.
    • SOURCE_IMAGE: Es el nombre de la imagen que se importará.
    • IMAGE_FORMAT: Es el formato de la imagen exportada. Los formatos válidos incluyen vmdk, vhdx, vpc, vdi y qcow2.
    • DESTINATION_URI: La ubicación del URI de Cloud Storage en la que deseas exportar el archivo de imagen Por ejemplo, gs://my-bucket/my-exported-image.vmdk
    • NETWORK: La ruta de acceso completa a una red de VPC compartida. Por ejemplo, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
    • SUBNET: La ruta de acceso completa a una subred de VPC compartida. Por ejemplo, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME

      Especificar este modo depende del modo de red de VPC.

      • Si la red de VPC usa el modo heredado, no especifiques una subred.
      • Si la red de VPC usa el modo automático, la especificación de la subred es opcional.
      • Si la red de VPC usa el modo personalizado, este campo debe especificarse.
    • ZONE: La zona que se usará para la exportación. Esta zona debe coincidir con la región de la subred. Por ejemplo, si SUBNET está en la región us-west1, la zona de exportación debe ser una de las siguientes: us-west1-a, us-west1-b o us-west1-c.

      En la mayoría de los casos, especificar una zona es opcional. Si se especifica SUBNET, se debe especificar la zona.

    Para conocer otros valores args 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.

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, haz lo siguiente:

  1. Opcional: Detén la instancia a la que está conectado 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 que contenga el archivo tar y especifica un valor para SIZE del disco que sea al menos un 50% mayor que el del 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 VM_NAME por el nombre de la instancia que deseas crear.

    gcloud compute instances create VM_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 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 VM_NAME por el nombre de la instancia a la que deseas conectarte.

    gcloud compute ssh VM_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. Opcional: Activa el disco de imagen y realiza 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, crea el archivo tar.gz:

    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 a Cloud Storage, usa la herramienta de línea de comandos de gsutil que viene preinstalada en tu instancia.

    1. Crea un bucket con gsutil.

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

      me@example-instance:~$ 
      gsutil mb gs://BUCKET_NAME
    2. Copia el archivo en el bucket nuevo. Reemplaza BUCKET_NAME por el nombre del bucket 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 la consola de Google Cloud.

¿Qué sigue?