Esporta un'immagine personalizzata in Cloud Storage


Se devi spostare i dati del disco di avvio di Compute Engine all'esterno del tuo progetto Compute Engine, puoi esportare un'immagine disco di avvio in Cloud Storage come file tar.gz. Se devi creare un'immagine disco permanente da utilizzare quando crei nuovi dischi permanenti su Compute Engine, leggi Creazione di un'immagine personalizzata.

Puoi eseguire il backup o condividere un'immagine personalizzata esportandola in Cloud Storage. Questo metodo è ideale per condividere singole immagini con progetti che non hanno accesso alle tue immagini. In alternativa, puoi condividere le immagini concedendo il ruolo utente immagine Compute Engine sull'immagine o sul progetto che la contiene.

Il seguente diagramma mostra alcuni flussi di lavoro tipici per la creazione e il riutilizzo di un'immagine personalizzata.

Creazione e riutilizzo di immagini personalizzate.
Figura 1. Esempi di creazione e riutilizzo di immagini personalizzate

Prima di iniziare

Limitazioni e restrizioni

Per i progetti protetti con Controlli di servizio VPC, utilizza uno dei seguenti metodi:

  • Esportare dallo stesso progetto in cui si trova l'immagine
  • esporta l'immagine manualmente.

Esporta un'immagine con un singolo comando

Esportazione di un'immagine in Cloud Storage

Puoi esportare le tue immagini utilizzando Google Cloud Console, Google Cloud CLI o l'API Cloud Build.

Console

  1. In Google Cloud Console, vai alla pagina Immagini.

    Vai a Immagini

  2. Fai clic sul nome dell'immagine che vuoi esportare per passare alla pagina dei dettagli dell'immagine. Non puoi esportare immagini pubbliche fornite da Google. Puoi esportare solo le immagini create o importate in precedenza.

  3. Nella pagina dei dettagli dell'immagine, fai clic su Esporta per aprire la pagina Esporta immagine.

  4. Nella pagina Esporta immagine, scegli il Formato di esportazione dell'immagine.

  5. Scegli la località di Cloud Storage in cui esportare l'immagine facendo clic su Sfoglia.

  6. Scegli una località Cloud Storage esistente per esportare l'immagine. In alternativa, segui le istruzioni per creare un nuovo bucket Cloud Storage, quindi inserisci un nome per il nuovo bucket Cloud Storage.

  7. Dopo aver scelto Cloud Storage, scegli un nome file per l'immagine esportata. Puoi utilizzare il nome file predefinito oppure scegliere un nome file personalizzato.

  8. Dopo aver scelto Cloud Storage e inserito un nome file per l'immagine, fai clic su Seleziona.

  9. Nella pagina Esporta immagine, fai clic su Esporta. Dopo aver scelto Esporta, la console Google Cloud mostra la cronologia delle esportazioni di immagini, dove puoi visualizzare il processo di esportazione delle immagini. Per ulteriori dettagli sul processo di esportazione delle immagini, fai clic sull'ID Cloud Build per andare alla pagina Dettagli esportazione dell'immagine in cui puoi visualizzare e scaricare il log di esportazione delle immagini.

  10. Vai alla pagina Spazio di archiviazione per accedere all'immagine esportata.

    Vai a Spazio di archiviazione

gcloud

Il modo migliore per esportare un'immagine in Cloud Storage è utilizzare il comando gcloud compute images export. Questo comando utilizza Daisy per concatenare i diversi passaggi necessari per esportare un'immagine. Si presume che tu abbia già creato un'immagine, ad esempio con il comando gcloud compute images create.

Utilizzando Google Cloud CLI, esegui:

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

Sostituisci quanto segue:

  • DESTINATION_URI: destinazione URI di Cloud Storage per il file immagine esportato.
  • IMAGE_NAME: il nome dell'immagine disco da esportare.

Per impostazione predefinita, le immagini vengono esportate nel formato Compute Engine, che è un file disk.raw con tarring e gzip. Per esportare immagini in altri formati supportati dall'utilità immagine disco QEMU, puoi utilizzare il flag --export-format. I formati validi includono vmdk, vhdx, vpc, vdi e qcow2.

Esempio

Ad esempio, il comando seguente esporta un'immagine denominata my-image da my-project in un bucket Cloud Storage denominato my-bucket. Per impostazione predefinita, l'immagine viene esportata come disk.raw file e viene compressa nel formato file tar.gz.

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

Per i flag, consulta la documentazione di riferimento di gcloud compute images export.

API

Nell'API, crea una richiesta POST all'API 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"
  ]
}

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto che contiene l'immagine che vuoi esportare.
  • SOURCE_IMAGE: il nome dell'immagine da esportare.
  • IMAGE_FORMAT: il formato dell'immagine esportata. I formati validi includono vmdk, vhdx, vpc, vdi e qcow2.
  • DESTINATION_URI: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio, gs://my-bucket/my-exported-image.vmdk.

Per altri valori args che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.

Risposta di esempio

La seguente risposta di esempio è simile all'output restituito:

{
"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"
 }
 }

Puoi monitorare la build in due modi:

  • Esegui una richiesta projects.builds.get utilizzando il metodo build-id restituito.
  • Esamina i log ospitati all'indirizzo logUrl fornito.

Esporta un'immagine da un progetto utilizzando un account di servizio Compute Engine personalizzato

Durante un'esportazione di immagini, viene creata un'istanza di macchina virtuale temporanea (VM) nel progetto. Lo strumento di esportazione delle immagini su questa VM temporanea deve essere autenticato.

Un account di servizio è un'identità collegata a una VM. I token di accesso all'account di servizio sono accessibili tramite il server dei metadati istanza e utilizzati per autenticare lo strumento di esportazione di immagini sulla VM.

Per impostazione predefinita, il processo di esportazione utilizza l'agente di servizio Compute Engine predefinito del progetto. Tuttavia, se l'account di servizio Compute Engine predefinito è disabilitato nel tuo progetto o se vuoi utilizzare un account di servizio Compute Engine personalizzato, devi creare un account di servizio e specificarlo per il processo di esportazione.

Per esportare le immagini, puoi utilizzare Google Cloud CLI o l'API Cloud Build.

gcloud

  1. Crea un account di servizio e assegna i ruoli minimi. Per ulteriori informazioni sulla creazione di account di servizio, consulta Creazione e gestione degli account di servizio.

    Come minimo, all'account di servizio Compute Engine specificato devono essere assegnati i seguenti ruoli:

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

    Per ulteriori informazioni, consulta Concedi i ruoli richiesti all'account di servizio Compute Engine.

  2. Usa il comando gcloud compute images export per esportare l'immagine.

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

    Sostituisci quanto segue:

    • DESTINATION_URI: destinazione URI di Cloud Storage per il file immagine esportato.
    • IMAGE_NAME: il nome dell'immagine disco da esportare.
    • SERVICE_ACCOUNT_EMAIL: l'indirizzo email associato all'account di servizio Compute Engine creato nel passaggio precedente.

Esempio

Ad esempio, il seguente comando esporta un'immagine denominata my-image da my-project in un bucket Cloud Storage denominato my-bucket con un account di servizio che ha l'indirizzo email image-export-service-account@proj-12345.iam.gserviceaccount.com. Per impostazione predefinita, l'immagine viene esportata come file disk.raw e viene compressa nel formato file 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
    

Per i flag, consulta la documentazione di riferimento di gcloud compute images export.

API

  1. Crea un account di servizio e assegna i ruoli minimi. Per ulteriori informazioni sulla creazione di account di servizio, consulta Creazione e gestione degli account di servizio.

    Come minimo, all'account di servizio Compute Engine specificato devono essere assegnati i seguenti ruoli:

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

    Per saperne di più, vedi Concedere i ruoli richiesti all'account di servizio Compute Engine.

  2. Nell'API, crea una richiesta POST all'API 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"
      ]
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del progetto che contiene l'immagine che vuoi esportare.
    • SOURCE_IMAGE: il nome dell'immagine da esportare.
    • IMAGE_FORMAT: il formato dell'immagine esportata. I formati validi includono vmdk, vhdx, vpc, vdi e qcow2.
    • DESTINATION_URI: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio, gs://my-bucket/my-exported-image.vmdk.
    • SERVICE_ACCOUNT_EMAIL: l'indirizzo email associato all'account di servizio Compute Engine creato nel passaggio precedente.

Per altri valori args che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.

Esportare un'immagine utilizzando un VPC condiviso

Prima di esportare un'immagine che utilizza un VPC condiviso, devi aggiungere il ruolo compute.networkUser all'account di servizio Cloud Build. Per ulteriori informazioni, consulta la pagina Concedere i ruoli richiesti all'account di servizio Cloud Build.

Per esportare l'immagine puoi utilizzare Google Cloud CLI o l'API Cloud Build.

gcloud

Usa il comando gcloud compute images export per esportare l'immagine.

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

Sostituisci quanto segue:

  • IMAGE_NAME: il nome dell'immagine da esportare.
  • DESTINATION_URI: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine.
  • PROJECT_ID: ID del progetto in cui si trova l'immagine.
  • NETWORK: il percorso completo di una rete VPC condivisa. Ad esempio, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
  • SUBNET: il percorso completo di una subnet VPC condivisa. Ad esempio, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

    La specifica di questa modalità dipende dalla modalità di rete VPC.

    • Se la rete VPC utilizza la modalità legacy, non specificare una subnet.
    • Se la rete VPC utilizza la modalità automatica, specificare la subnet è facoltativa.
    • Se la rete VPC utilizza la modalità personalizzata, è necessario specificare questo campo.
  • ZONE: la zona da utilizzare per l'esportazione. Questa zona deve corrispondere all'area geografica della subnet. Ad esempio, se l'area geografica SUBNET si trova nell'area geografica us-west1, la zona di esportazione deve essere una delle seguenti: us-west1-a, us-west1-b o us-west1-c.

    Nella maggior parte dei casi specificare una zona è facoltativo. Se SUBNET è specificato, deve essere specificata la zona.

Ad esempio, il comando seguente esporta un'immagine denominata example-image da my-project in un bucket Cloud Storage denominato my-bucket. In questo esempio la rete Virtual Private Cloud (my-shared-vp) utilizza una subnet personalizzata (my-custom-subnet). Per impostazione predefinita, l'immagine viene esportata come file disk.raw e viene compressa nel formato file tar.gz.

Comando di esempio

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. Aggiungi l'immagine a Cloud Storage.

  2. Nell'API, crea una richiesta POST all'API 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"
      ]
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: l'ID del progetto che contiene l'immagine che vuoi esportare.
    • SOURCE_IMAGE: il nome dell'immagine da esportare.
    • IMAGE_FORMAT: il formato dell'immagine esportata. I formati validi includono vmdk, vhdx, vpc, vdi e qcow2.
    • DESTINATION_URI: la posizione dell'URI Cloud Storage in cui vuoi esportare il file immagine. Ad esempio, gs://my-bucket/my-exported-image.vmdk.
    • NETWORK: il percorso completo di una rete VPC condivisa. Ad esempio, projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
    • SUBNET: il percorso completo di una subnet VPC condivisa. Ad esempio, projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

      La specifica di questa modalità dipende dalla modalità di rete VPC.

      • Se la rete VPC utilizza la modalità legacy, non specificare una subnet.
      • Se la rete VPC utilizza la modalità automatica, specificare la subnet è facoltativa.
      • Se la rete VPC utilizza la modalità personalizzata, è necessario specificare questo campo.
    • ZONE: la zona da utilizzare per l'esportazione. Questa zona deve corrispondere all'area geografica della subnet. Ad esempio, se l'area geografica SUBNET si trova nell'area geografica us-west1, la zona di esportazione deve essere una delle seguenti: us-west1-a, us-west1-b o us-west1-c.

      Nella maggior parte dei casi specificare una zona è facoltativo. Se SUBNET è specificato, deve essere specificata la zona.

    Per altri valori args che possono essere forniti, consulta la sezione relativa ai flag facoltativi della pagina di GitHub per l'esportazione di immagini VM.

Creare ed esportare manualmente un'immagine

Se i comandi gcloud compute images create e gcloud compute images export non soddisfano i tuoi requisiti, puoi creare ed esportare manualmente un'immagine da un'istanza Compute Engine. Questo processo prevede passaggi diversi per creare un'immagine e poi esportarla.

Nell'esempio seguente, il disco creato si chiama image-disk.

Per creare ed esportare un'immagine:

  1. (Facoltativo) Arresta l'istanza a cui è collegato il disco prima di creare lo snapshot. l'arresto dell'istanza garantisce l'integrità dei contenuti del disco nello snapshot. Sostituisci DISK_NAME con il nome del disco che vuoi utilizzare per creare lo snapshot.

  2. Crea uno snapshot del disco. Assegna allo snapshot il nome image-snapshot.

    gcloud compute disks snapshot DISK_NAME \
        --snapshot-names image-snapshot
  3. Utilizza lo snapshot image-snapshot per creare un nuovo disco denominato image-disk eseguendo il comando seguente:

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. Crea un disco temporaneo denominato temporary-disk per contenere il tuo file tar e specifica che il file SIZE del disco deve essere almeno il 50% più grande del disco immagine.

    Puoi scollegare ed eliminare il disco in un secondo momento.

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

    dove SIZE è la dimensione, in gigabyte o terabyte, del disco temporaneo. Ad esempio, specifica 100GB per creare un disco da 100 gigabyte.

  5. Crea un'istanza e abilita l'ambito storage-rw sull'istanza. Inoltre, collega image-disk e temporary-disk all'istanza come dischi secondari con attributi device-name specifici. Sostituisci VM_NAME con il nome dell'istanza da creare.

    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

    Tieni presente che stai passando agli ambiti dell'account di servizio in modo da poter caricare il file su Cloud Storage nei passaggi successivi.

    Se necessario, esamina i dettagli sull'avvio di una nuova istanza.

  6. Connettiti all'istanza. Sostituisci VM_NAME con il nome dell'istanza a cui connetterti.

    gcloud compute ssh VM_NAME
  7. Formatta e monta il disco temporaneo. La formattazione del disco elimina i contenuti del disco temporaneo.

    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. (Facoltativo) Monta il disco immagine e apporta ulteriori modifiche prima di creare il file tar. Ad esempio, puoi eliminare eventuali file esistenti dalla directory /home se non vuoi che facciano parte dell'immagine. Monta le partizioni del disco che devi modificare, cambia i file sul disco che devi cambiare e, al termine, smonta il disco.

    1. Crea una directory in cui puoi montare il disco o la partizione.

      sudo mkdir /mnt/image-disk
    2. Usa il comando ls per determinare quale disco o partizione del disco devi montare.

      ls /dev/disk/by-id/

      Il comando stampa un elenco di ID e partizioni del disco. Ad esempio, il seguente disco ha una tabella di partizione con una partizione. L'ID google-image-disk rimanda al disco completo da cui vuoi creare un'immagine. L'ID google-image-disk-part1 rimanda alla prima partizione su questo disco. Monta la partizione se devi apportare modifiche al disco, quindi crea l'immagine dal disco completo.

      google-image-disk
      google-image-disk-part1
      
    3. Monta il disco o la partizione. Se il disco ha una tabella delle partizioni, monta le singole partizioni del disco. Ad esempio, monta google-image-disk-part1.

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

      In alternativa, se il disco è formattato senza tabella di partizione, monta il disco completo google-image-disk.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Modifica i file nella directory /mnt/image-disk per configurare i file sul disco. Ad esempio, potresti rimuovere il file /mnt/image-disk/home/[USER]/.ssh/authorized_keys per evitare che le chiavi SSH vengano condivise.

    5. Quando hai finito di modificare i file, smonta il disco.

      sudo umount /mnt/image-disk/
  9. Crea un file tar della tua immagine.

    Quando hai finito di personalizzare i file sul disco immagine, crea un file disco non elaborato sul disco temporaneo. Il nome dell'immagine disco non elaborata deve essere 'disk.raw':

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

    Poi crea il file tar.gz:

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    Questo comando crea un'immagine dell'istanza nella posizione seguente:

    /mnt/tmp/myimage.tar.gz

  10. Caricare l'immagine in Cloud Storage.

    Per caricare il file tar in Cloud Storage, utilizza lo strumento a riga di comando gsutil preinstallato nella tua istanza.

    1. Crea un bucket utilizzando gsutil.

      Assicurati di rivedere le linee guida per la denominazione di bucket e oggetti prima di creare il bucket. Quindi, crea il tuo bucket utilizzando il comando seguente. Sostituisci BUCKET_NAME con il nome del bucket da creare.

      me@example-instance:~$ 
      gsutil mb gs://BUCKET_NAME
    2. Copia il file nel nuovo bucket. Sostituisci BUCKET_NAME con il nome del bucket in cui copiare il file.

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

Hai esportato il file in Cloud Storage. Ora puoi condividere l'immagine con altre persone o utilizzare il file tar per aggiungere una nuova immagine a un progetto Google Cloud Console.

Passaggi successivi