Exporter une image personnalisée vers Cloud Storage


Si vous devez transférer les données du disque de démarrage Compute Engine en dehors de votre projet Compute Engine, vous pouvez exporter une image de disque de démarrage vers Cloud Storage sous la forme d'un fichier tar.gz. Si vous avez besoin de créer une image de disque persistant à utiliser lorsque vous créez des disques persistants sur Compute Engine, consultez la section Créer une image personnalisée.

Vous pouvez sauvegarder ou partager une image personnalisée en l'exportant vers Cloud Storage. Cette méthode est idéale pour partager des images individuelles avec des projets qui n'ont pas accès à vos images. Vous pouvez également autoriser le partage d'une image en attribuant à une ou plusieurs personnes le rôle d'utilisateur d'images Compute Engine sur une image spécifique ou sur le projet contenant l'image.

Le diagramme ci-dessous présente certains workflows types pour la création et la réutilisation d'une image personnalisée.

Créer et réutiliser des images personnalisées
Figure 1. Exemples de création et de réutilisation d'images personnalisées

Avant de commencer

Limites et restrictions

Pour les projets protégés avec VPC Service Controls, utilisez l'une des méthodes suivantes :

  • Exporter depuis le projet où se trouve l'image
  • Exporter l'image manuellement

Exporter une image à l'aide d'une seule commande

Exporter une image vers Cloud Storage

Vous pouvez exporter vos images à l'aide de la console Google Cloud, de Google Cloud CLI ou de l'API Cloud Build

Console

  1. Dans la console Google Cloud, accédez à la page Images.

    Accéder à la page "Images"

  2. Cliquez sur le nom de l'image que vous souhaitez exporter pour accéder à la page des détails de l'image. Vous ne pouvez pas exporter d'images publiques fournies par Google. Vous ne pouvez exporter que les images que vous avez précédemment créées ou importées.

  3. Sur la page des détails de l'image, cliquez sur Exporter pour ouvrir la page Exporter l'image.

  4. Sur la page Exporter l'image, choisissez le format d'exportation de l'image.

  5. Choisissez l'emplacement Cloud Storage vers lequel vous souhaitez exporter votre image en cliquant sur Parcourir.

  6. Choisissez un emplacement Cloud Storage existant pour exporter votre image. Vous pouvez également suivre les instructions de création d'un bucket Cloud Storage, puis nommer le nouveau bucket Cloud Storage.

  7. Après avoir sélectionné un emplacement Cloud Storage, choisissez un nom de fichier pour l'image exportée. Vous pouvez utiliser le nom de fichier par défaut ou choisir votre propre nom de fichier.

  8. Après avoir sélectionné un emplacement Cloud Storage et saisi un nom de fichier pour l'image, cliquez sur Sélectionner.

  9. Sur la page Exporter l'image, cliquez sur Exporter. Lorsque vous sélectionnez Exporter, la console Google Cloud affiche l'historique des exportations d'images. Il vous permet de consulter le processus d'exportation d'images. Pour en savoir plus sur le processus d'exportation d'images, cliquez sur l'ID Cloud Build pour accéder à la page Détails sur les exportations d'images. Elle vous permet d'afficher et de télécharger le journal des exportations d'images.

  10. Pour accéder à l'image exportée, consultez la page Stockage.

    Accéder à Cloud Storage

gcloud

Le moyen le plus simple d'exporter une image vers Cloud Storage consiste à utiliser la commande gcloud compute images export. Cette commande exploite l'outil Daisy, qui permet d'exécuter à la suite les différentes étapes nécessaires à l'exportation d'une image. Nous partons ici du principe que vous avez déjà créé une image, par exemple à l'aide de la commande gcloud compute images create.

À l'aide de Google Cloud CLI, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • DESTINATION_URI : destination de l'URI Cloud Storage du fichier image exporté.
  • IMAGE_NAME : nom de l'image disque à exporter.

Par défaut, les images sont exportées au format Compute Engine, qui est un fichier disk.raw compressé aux formats TAR et GZIP. Pour exporter des images dans d'autres formats compatibles avec l'utilitaire d'image disque QEMU, vous pouvez utiliser l'option --export-format. Les formats valides sont vmdk, vhdx, vpc, vdi et qcow2.

Exemple

Par exemple, la commande suivante permet d'exporter une image appelée my-image depuis le projet my-project vers un bucket Cloud Storage appelé my-bucket. Par défaut, l'image est exportée en tant que disk.raw file et compressée au format de fichier tar.gz.

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

Pour en savoir plus sur les indicateurs, consultez la documentation de référence de gcloud compute images export.

API

Dans l'API, créez une requête POST auprès de l'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"
  ]
}

Remplacez l'élément suivant :

  • PROJECT_ID : ID du projet contenant l'image que vous souhaitez exporter.
  • SOURCE_IMAGE : nom de l'image à exporter.
  • IMAGE_FORMAT : format de l'image exportée. Les formats valides sont vmdk, vhdx, vpc, vdi et qcow2.
  • DESTINATION_URI : emplacement d'URL Cloud Storage vers lequel vous souhaitez exporter le fichier image. Exemple : gs://my-bucket/my-exported-image.vmdk.

Pour connaître les autres valeurs args que vous pouvez spécifier, consultez la section "Optional flags" (Options facultatives) de la page GitHub dédiée à l'exportation d'images de VM.

Exemple de réponse

L'exemple de réponse suivant ressemble au résultat renvoyé :

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

Vous pouvez surveiller votre compilation de deux manières différentes :

  • Exécutez une requête projects.builds.get en utilisant la valeur build-id renvoyée.
  • Examinez les journaux hébergés à l'adresse logUrl fournie.

Exporter une image d'un projet à l'aide d'un compte de service Compute Engine personnalisé

Lors d'une exportation d'image, une instance de machine virtuelle (VM) temporaire est créée dans votre projet. L'outil d'exportation d'image de cette VM temporaire doit être authentifié.

Un compte de service est une identité associée à une VM. Les jetons d'accès au compte de service sont accessibles via le serveur de métadonnées d'instance et permettent d'authentifier l'outil d'exportation d'images sur la VM.

Par défaut, le processus d'exportation utilise l'agent de service Compute Engine par défaut du projet. Toutefois, si le compte de service Compute Engine par défaut est désactivé dans votre projet ou si vous souhaitez utiliser un compte de service Compute Engine personnalisé, vous devez créer un compte de service et le spécifier pour le processus d'exportation.

Vous pouvez exporter vos images à l'aide de Google Cloud CLI ou de l'API Cloud Build.

gcloud

  1. Créez un compte de service et attribuez les rôles minimaux. Pour en savoir plus sur la création des comptes de service, consultez la page Créer et gérer des comptes de service.

    Au minimum, le compte de service Compute Engine spécifié doit avoir les rôles suivants :

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

    Pour en savoir plus, consultez la section Attribuer les rôles requis au compte de service Compute Engine.

  2. Exécutez la commande gcloud compute images export pour exporter l'image.

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

    Remplacez les éléments suivants :

    • DESTINATION_URI : destination de l'URI Cloud Storage du fichier image exporté.
    • IMAGE_NAME : nom de l'image disque à exporter.
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail associée au compte de service Compute Engine créé à l'étape précédente.

Exemple

Par exemple, la commande suivante permet d'exporter une image appelée my-image depuis le projet my-project vers un bucket Cloud Storage nommé my-bucket avec un compte de service dont l'adresse e-mail est image-export-service-account@proj-12345.iam.gserviceaccount.com. Par défaut, l'image est exportée en tant que fichier disk.raw et compressée au format 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
    

Pour en savoir plus sur les indicateurs, consultez la documentation de référence de gcloud compute images export.

API

  1. Créez un compte de service et attribuez les rôles minimaux. Pour en savoir plus sur la création des comptes de service, consultez la page Créer et gérer des comptes de service.

    Au minimum, le compte de service Compute Engine spécifié doit avoir les rôles suivants :

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

    Pour en savoir plus, consultez la section Attribuer les rôles requis au compte de service Compute Engine.

  2. Dans l'API, créez une requête POST auprès de l'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"
      ]
    }
    

    Remplacez l'élément suivant :

    • PROJECT_ID : ID du projet contenant l'image que vous souhaitez exporter.
    • SOURCE_IMAGE : nom de l'image à exporter.
    • IMAGE_FORMAT : format de l'image exportée. Les formats valides sont vmdk, vhdx, vpc, vdi et qcow2.
    • DESTINATION_URI : emplacement d'URL Cloud Storage vers lequel vous souhaitez exporter le fichier image. Exemple : gs://my-bucket/my-exported-image.vmdk.
    • SERVICE_ACCOUNT_EMAIL : adresse e-mail associée au compte de service Compute Engine créé à l'étape précédente.

Pour connaître les autres valeurs args que vous pouvez spécifier, consultez la section "Optional flags" (Options facultatives) de la page GitHub dédiée à l'exportation d'images de VM.

Exporter une image à l'aide d'un VPC partagé

Avant d'exporter une image qui utilise un VPC partagé, vous devez ajouter le rôle compute.networkUser au compte de service Cloud Build. Pour plus d'informations, consultez la section Attribuer les rôles requis au compte de service Cloud Build.

Vous pouvez exporter votre image à l'aide de Google Cloud CLI ou de l'API Cloud Build.

gcloud

Exécutez la commande gcloud compute images export pour exporter votre image.

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

Remplacez les éléments suivants :

  • IMAGE_NAME : nom de l'image à exporter.
  • DESTINATION_URI : emplacement d'URL Cloud Storage vers lequel vous souhaitez exporter le fichier image.
  • PROJECT_ID : ID du projet dans lequel se trouve l'image.
  • NETWORK : chemin d'accès complet à un réseau VPC partagé. Exemple : projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
  • SUBNET : chemin d'accès complet à un sous-réseau VPC partagé. Exemple : projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

    La spécification de ce mode dépend du mode de réseau VPC.

    • Si le réseau VPC utilise l'ancien mode, ne spécifiez pas de sous-réseau.
    • Si le réseau VPC utilise le mode automatique, la spécification du sous-réseau est facultative.
    • Si le réseau VPC utilise le mode personnalisé, ce champ doit être spécifié.
  • ZONE : zone à utiliser pour l'exportation. Cette zone doit correspondre à la région du sous-réseau. Par exemple, si la région SUBNET se trouve dans la région us-west1, la zone d'exportation doit être l'une des suivantes : us-west1-a, us-west1-b ou us-west1-c.

    Dans la plupart des cas, la spécification d'une zone est facultative. Si un sous-réseau (SUBNET) est spécifié, la zone doit être spécifiée.

Par exemple, la commande suivante permet d'exporter une image appelée example-image depuis le projet my-project vers un bucket Cloud Storage appelé my-bucket. Dans cet exemple, le réseau cloud privé virtuel (my-shared-vp) utilise un sous-réseau personnalisé (my-custom-subnet). Par défaut, l'image est exportée en tant que fichier disk.raw et compressée au format de fichier tar.gz.

Exemple de commande

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. Ajoutez l'image dans Cloud Storage.

  2. Dans l'API, créez une requête POST auprès de l'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"
      ]
    }
    

    Remplacez l'élément suivant :

    • PROJECT_ID : ID du projet contenant l'image que vous souhaitez exporter.
    • SOURCE_IMAGE : nom de l'image à exporter.
    • IMAGE_FORMAT : format de l'image exportée. Les formats valides sont vmdk, vhdx, vpc, vdi et qcow2.
    • DESTINATION_URI : emplacement d'URL Cloud Storage vers lequel vous souhaitez exporter le fichier image. Exemple : gs://my-bucket/my-exported-image.vmdk.
    • NETWORK : chemin d'accès complet à un réseau VPC partagé. Exemple : projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME.
    • SUBNET : chemin d'accès complet à un sous-réseau VPC partagé. Exemple : projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME.

      La spécification de ce mode dépend du mode de réseau VPC.

      • Si le réseau VPC utilise l'ancien mode, ne spécifiez pas de sous-réseau.
      • Si le réseau VPC utilise le mode automatique, la spécification du sous-réseau est facultative.
      • Si le réseau VPC utilise le mode personnalisé, ce champ doit être spécifié.
    • ZONE : zone à utiliser pour l'exportation. Cette zone doit correspondre à la région du sous-réseau. Par exemple, si la région SUBNET se trouve dans la région us-west1, la zone d'exportation doit être l'une des suivantes : us-west1-a, us-west1-b ou us-west1-c.

      Dans la plupart des cas, la spécification d'une zone est facultative. Si un sous-réseau (SUBNET) est spécifié, la zone doit être spécifiée.

    Pour connaître les autres valeurs args que vous pouvez spécifier, consultez la section "Optional flags" (Options facultatives) de la page GitHub dédiée à l'exportation d'images de VM.

Créer et exporter une image manuellement

Si les commandes gcloud compute images create et gcloud compute images export ne répondent pas à vos exigences, vous pouvez créer et exporter une image manuellement à partir d'une instance Compute Engine. Ce processus comporte des étapes distinctes permettant de créer, puis d'exporter une image.

Dans l'exemple suivant, notez que le disque créé est appelé image-disk.

Pour créer et exporter une image, effectuez les étapes suivantes :

  1. Facultatif : Arrêtez l'instance associée au disque avant de créer l'instantané. Cette opération facultative permet d'assurer l'intégrité du contenu du disque au sein de l'instantané. Remplacez DISK_NAME par le nom du disque que vous souhaitez utiliser pour créer l'instantané.

  2. Créez un instantané du disque. Nommez-le image-snapshot.

    gcloud compute disks snapshot DISK_NAME \
        --snapshot-names image-snapshot
  3. Exécutez la commande suivante pour créer un disque appelé image-disk à partir de l'instantané image-snapshot :

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. Créez un disque temporaire nommé temporary-disk pour stocker votre fichier tar. Spécifiez le paramètre SIZE et assurez-vous que le disque temporaire soit au moins 50 % plus volumineux que le disque image-disk.

    Vous pourrez dissocier et supprimer ce disque temporaire plus tard.

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

    SIZE correspond à la taille, en gigaoctets ou en téraoctets, du disque temporaire. Par exemple, spécifiez 100GB pour créer un disque de 100 Go.

  5. Créez une instance et activez le champ d'application storage-rw sur celle-ci. Associez également image-disk et temporary-disk à l'instance en tant que disques secondaires avec des attributs device-name spécifiques. Remplacez VM_NAME par le nom de l'instance à créer.

    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

    Notez que l'envoi de champs d'application de compte de service vous permettra d'importer votre fichier dans Cloud Storage par la suite.

    Étudiez plus en détail comment démarrer une nouvelle instance si nécessaire.

  6. Connectez-vous à l'instance. Remplacez VM_NAME par le nom de l'instance à laquelle vous souhaitez vous connecter.

    gcloud compute ssh VM_NAME
  7. Formatez et installez le disque temporaire. Le formatage permet de supprimer le contenu du disque temporaire.

    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. Facultatif : Installez le disque "image-disk" et apportez des modifications supplémentaires avant de créer le fichier tar. Par exemple, vous pouvez supprimer tous les fichiers du répertoire /home si vous ne souhaitez pas qu'ils soient présents dans votre image. Installez les partitions de disque dont vous avez besoin, modifiez les fichiers concernés sur le disque en question, puis désinstallez le disque une fois l'opération terminée.

    1. Créez un répertoire dans lequel vous pourrez installer votre disque ou votre partition.

      sudo mkdir /mnt/image-disk
    2. Identifiez le disque ou la partition à installer à l'aide de la commande ls.

      ls /dev/disk/by-id/

      La commande affiche une liste d'ID et de partitions de disque. Par exemple, le disque suivant possède une table de partition ne contenant qu'une partition. L'ID google-image-disk pointe vers le disque complet à partir duquel vous souhaitez créer une image. L'ID google-image-disk-part1 pointe vers la première partition de ce disque. Installez la partition si vous avez besoin d'apporter des modifications au disque, puis créez l'image à partir du disque complet.

      google-image-disk
      google-image-disk-part1
      
    3. Installez le disque ou la partition. Si votre disque possède une table de partition, installez les partitions individuelles de votre disque. Par exemple, installez google-image-disk-part1.

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

      Si votre disque est au format RAW et ne possède pas de table de partition, installez le disque google-image-disk complet.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Modifiez les fichiers du répertoire /mnt/image-disk pour configurer les fichiers sur le disque. Vous pouvez par exemple supprimer le fichier /mnt/image-disk/home/[USER]/.ssh/authorized_keys afin d'empêcher le partage de vos clés SSH.

    5. Une fois les fichiers modifiés, désinstallez le disque.

      sudo umount /mnt/image-disk/
  9. Créez un fichier tar de votre image.

    Lorsque vous avez fini de personnaliser les fichiers du disque "image-disk", créez un fichier de disque RAW sur votre disque temporaire. Le nom de l'image du disque RAW doit être "disk.raw" :

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

    Créez ensuite le fichier tar.gz :

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    Cette commande permet de créer une image de l'instance à l'emplacement suivant :

    /mnt/tmp/myimage.tar.gz

  10. Importez l'image dans Cloud Storage.

    Pour importer le fichier tar dans Cloud Storage, utilisez l'outil de ligne de commande gsutil préinstallé sur votre instance.

    1. Créez un bucket à l'aide de gsutil.

      Avant de créer votre bucket, vérifiez les consignes d'attribution de noms pour les buckets et les objets. Créez ensuite votre bucket à l'aide de la commande suivante : Remplacez BUCKET_NAME par le nom du bucket à créer.

      me@example-instance:~$ 
      gsutil mb gs://BUCKET_NAME
    2. Copiez votre fichier dans votre nouveau bucket. Remplacez BUCKET_NAME par le nom du bucket dans lequel copier le fichier.

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

Vous avez exporté votre fichier vers Cloud Storage. Vous pouvez maintenant partager l'image avec d'autres personnes ou utiliser le fichier tar pour ajouter une nouvelle image à un projet de la console Google Cloud.

Étapes suivantes