Benutzerdefiniertes Image zu Google Cloud Storage exportieren

Wenn Sie Daten eines Compute Engine-Bootlaufwerks aus einem Compute Engine-Projekt heraus verschieben müssen, können Sie ein Bootlaufwerk-Image als tar.gz-Datei zu Cloud Storage exportieren. Wenn Sie ein Image eines nichtflüchtigen Speichers erstellen müssen, das beim Erstellen neuer nichtflüchtiger Speicher in Compute Engine verwendet werden soll, lesen Sie Benutzerdefiniertes Image erstellen.

Sie können ein benutzerdefiniertes Image sichern oder freigeben, indem Sie es zu Cloud Storage exportieren. Diese Methode ist ideal, um einzelne Images für Projekte freizugeben, die keinen Zugriff auf Ihre Images haben. Alternativ können Sie Images freigeben, indem Sie der Compute Engine Image-Nutzerrolle das Image oder das Projekt zuweisen, das sie enthält.

Das folgende Diagramm zeigt einige typische Arbeitsabläufe, um ein benutzerdefiniertes Image zu erstellen und wiederzuverwenden.

Benutzerdefinierte Images erstellen und wiederverwenden
Abbildung 1: Beispiele für das Erstellen und Wiederverwenden von benutzerdefinierten Images

Vorbereitung

Cloud Build API aktivieren

Das Tool zum Exportieren virtueller Appliances verwendet Cloud Build.

In den meisten Fällen versucht gcloud compute images export, dem Cloud Build-Dienstkonto diese Berechtigungen zu gewähren. Sie können diese Berechtigungen auch manuell gewähren, um dafür zu sorgen, dass die erforderlichen Berechtigungen wirksam sind.

Konsole

  1. Aktivieren Sie in der Google Cloud Console die Cloud Build API.

    Cloud Build API aufrufen

    Wenn Sie die Cloud Build API über die Console aktivieren, erteilt Compute Engine dem Cloud Build-Dienstkonto die folgenden Rollen, damit der Cloud Build-Dienst Instanzen aus Compute Engine exportieren kann:

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

    Das Exporttool verwendet auch das Compute Engine-Standarddienstkonto. Das Compute Engine-Dienstkonto hat standardmäßig die Cloud IAM-Rolle "Projektbearbeiter". Wenn diese Rolle entfernt wird, kann der Exportvorgang fehlschlagen. Informationen zum Hinzufügen der Rolle zum Dienstkonto finden Sie unter Zugriff gewähren. Weitere Informationen zum Compute Engine-Standarddienstkonto finden Sie unter Compute Engine-Standarddienstkonto.

gcloud

Führen Sie die folgenden Schritte aus, um den Cloud Build-Dienst mit dem gcloud-Befehlszeilentool einzurichten:

  1. Aktivieren Sie Cloud Build mit dem gcloud-Befehlszeilentool.

    gcloud services enable cloudbuild.googleapis.com

    Das Exporttool verwendet auch das Compute Engine-Standarddienstkonto. Das Compute Engine-Dienstkonto hat standardmäßig die Cloud IAM-Rolle "Projektbearbeiter". Wenn diese Rolle entfernt wird, kann der Exportvorgang fehlschlagen. Informationen zum Hinzufügen der Rolle zum Dienstkonto finden Sie unter Zugriff gewähren. Weitere Informationen zum Compute Engine-Standarddienstkonto finden Sie unter Compute Engine-Standarddienstkonto.

  2. Fügen Sie dem Dienstkonto für die Cloud Build API die Rolle compute.admin hinzu.

        gcloud projects add-iam-policy-binding project-id \
           --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
           --role roles/compute.admin
        
  3. Fügen Sie dem Dienstkonto für die Cloud Build API die Rolle iam.serviceAccountUser hinzu.

        gcloud projects add-iam-policy-binding project-id \
           --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
           --role roles/iam.serviceAccountUser
        
  4. Fügen Sie dem Dienstkonto für die Cloud Build API die Rolle iam.serviceAccountTokenCreator hinzu.

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

    Dabei gilt:

Images mit einem Befehl exportieren

Konsole

  1. Rufen Sie in der Google Cloud Console die Seite Images auf.

    Zur Seite Images

  2. Klicken Sie auf den Namen des Images, das Sie exportieren möchten, um die Image-Detailseite aufzurufen. Sie können keine von Google bereitgestellten öffentlichen Images exportieren. Sie können nur Images exportieren, die Sie zuvor erstellt oder importiert haben.

  3. Klicken Sie auf der Image-Detailseite auf Exportieren, um die Seite Image exportieren zu öffnen.

  4. Wählen Sie auf der Seite Image exportieren das Exportformat des Images aus.

  5. Klicken Sie auf Durchsuchen, um den Cloud Storage-Speicherort auszuwählen, zu dem Sie das Image exportieren möchten.

  6. Wählen Sie einen vorhandenen Cloud Storage-Speicherort für den Export des Images aus. Oder folgen Sie der Anleitung zum Erstellen eines neuen Cloud Storage-Buckets und geben Sie dann einen Namen für den neuen Cloud Storage-Bucket ein.

  7. Wählen Sie nach der Auswahl des Cloud Storage-Speicherorts einen Dateinamen für das exportierte Image aus. Sie können entweder den standardmäßigen Dateinamen oder einen eigenen Dateinamen verwenden.

  8. Nachdem Sie einen Cloud Storage-Speicherort ausgewählt und einen Dateinamen für das Image eingegeben haben, klicken Sie auf Auswählen.

  9. Klicken Sie auf der Seite Image exportieren auf Exportieren. Nachdem Sie Exportieren ausgewählt haben, zeigt die Cloud Console den Image-Exportverlauf an, unter dem Sie den Exportvorgang des Images ansehen können. Für weitere Informationen zum Image-Exportvorgang klicken Sie auf die Cloud Build-ID, um die Seite Image-Exportdetails aufzurufen. Dort können Sie das Image-Exportlog ansehen und herunterladen.

  10. Gehen Sie zur Seite Storage, um auf das exportierte Image zuzugreifen.

    Zur Seite Storage

gcloud

In der Regel ist es am besten, ein Image mit dem Befehl gcloud compute images export zu Cloud Storage zu exportieren. Dieser Befehl verwendet Daisy, um die zahlreichen, für den Export eines Images erforderlichen Schritte zu verknüpfen. Bei dem Befehl wird davon ausgegangen, dass Sie bereits ein Image erstellt haben, z. B. mit dem Befehl gcloud compute images create.

Führen Sie folgenden Code mit dem gcloud-Befehlszeilentool aus:

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

Dabei gilt:

  • destination-uri ist der Ziel-URI in Cloud Storage für die exportierte virtuelle Laufwerksdatei.
  • image-name ist der Name des Laufwerk-Images, das exportiert werden soll.

Mit dem folgenden Befehl wird z. B. ein Image mit dem Namen my-image von my-project in einen Cloud Storage-Bucket mit dem Namen my-bucket exportiert. Standardmäßig wird das Image als disk.raw-Datei exportiert und im Dateiformat tar.gz komprimiert.

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

Eine Liste aller verfügbaren Flags finden Sie in der Referenzdokumentation zu gcloud compute images export.

API

Erstellen Sie in der API eine POST-Anfrage an die Cloud Build API.

    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"
          ]
        }
      ],
      "tags":[
        "gce-daisy",
        "gce-daisy-image-export"
      ]
    }
    

Dabei gilt:

  • project-id ist die ID des Projekts, das das zu exportierende Image enthält.
  • timeout ist die maximale Zeit, die ein Build dauern sollte, bevor er mit der Meldung TIMEOUT fehlschlägt. In der API muss die Zeit in Sekunden angegeben werden. Der Wert 7200s für die Zeitüberschreitung sollte für die meisten Szenarien geeignet sein.
  • source-image ist der Name des zu exportierenden Images.
  • image-format ist das Format des exportierten Images. Gültige Formate sind vmdk, vhdx, vpc, vdi und qcow2.
  • destination-uri ist der URI des Speicherorts in Cloud Storage, an den Sie die virtuelle Laufwerksdatei exportieren möchten. Beispiel: gs://my-bucket/my-exported-image.vmdk.

Weitere args-Werte, die Sie bereitstellen können, finden Sie im Bereich zu optionalen Flags auf der GitHub-Seite für den VM-Image-Export.

Beispielantwort

Die folgende Beispielantwort sieht in etwa so aus wie die zurückgegebene Ausgabe:

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

Es gibt mehrere Möglichkeiten, Ihren Build zu überwachen:

  • Führen Sie eine projects.builds.get-Anfrage mit dem zurückgegebenen build-id aus.
  • Prüfen Sie die Logs, die unter der bereitgestellten logUrl gehostet werden.

Images manuell erstellen und exportieren

Wenn die Befehle gcloud compute images create und gcloud compute images export Ihren Anforderungen nicht gerecht werden, können Sie ein Image manuell über eine Compute Engine-Instanz erstellen und exportieren. Dieser Vorgang besteht aus einzelnen Schritten. Zuerst wird ein Image erstellt und dann exportiert.

Beachten Sie im folgenden Beispiel, dass das erstellte Laufwerk als image-disk bezeichnet wird.

Ein Image erstellen und exportieren

  1. Gegebenenfalls ist es nötig, die mit dem Laufwerk verbundene Instanz zu beenden, bevor Sie einen Snapshot erstellen. Durch Beenden der Instanz wird die Integrität der Festplatteninhalte im Snapshot sichergestellt. Ersetzen Sie disk-name durch den Namen des Laufwerks, das Sie zum Erstellen des Snapshots verwenden möchten.

  2. Erstellen Sie einen Snapshot des Laufwerks. Geben Sie dem Snapshot den Namen image-snapshot.

        gcloud compute disks snapshot disk-name \
            --snapshot-names image-snapshot
  3. Verwenden Sie den Snapshot image-snapshot, um ein neues Laufwerk mit dem Namen image-disk zu erstellen. Führen Sie dazu den folgenden Befehl aus:

        gcloud compute disks create image-disk \
            --source-snapshot image-snapshot
  4. Erstellen Sie für Ihre TAR-Datei ein temporäres Laufwerk mit dem Namen temporary-disk und legen Sie seine Größe (size) so fest, dass das Laufwerk mindestens 50 % größer als das Image-Laufwerk ist.

    Sie können das Laufwerk anschließend trennen und löschen.

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

    Dabei ist size die Größe des temporären Laufwerks in Gigabyte oder Terabyte. Geben Sie beispielsweise 100GB an, um ein Laufwerk von 100 Gigabyte zu erstellen.

  5. Erstellen Sie eine Instanz und aktivieren Sie in der Instanz den Gültigkeitsbereich storage-rw. Hängen Sie außerdem image-disk und temporary-disk als sekundäre Laufwerke mit spezifischen device-name-Attributen an die Instanz an. Ersetzen Sie dabei instance-name durch den Namen der zu erstellenden Instanz.

        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

    Achten Sie darauf, die Dienstkontenbereiche zu übertragen, damit Sie Ihre Datei später in Cloud Storage hochladen können.

    Weitere Informationen finden Sie bei Bedarf in der Dokumentation Eine neue Instanz starten.

  6. Stellen Sie eine Verbindung zur Instanz her. Ersetzen Sie dabei instance-name durch den Namen der Instanz, zu der eine Verbindung hergestellt werden soll.

        gcloud compute ssh instance-name
  7. Formatieren Sie ein neues temporäres Laufwerk und stellen Sie es bereit. Der Formatierungsvorgang löscht alle Inhalte des temporären Laufwerks.

    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. Optional können Sie das Image-Laufwerk bereitstellen und zusätzliche Änderungen vornehmen, bevor Sie die TAR-Datei erstellen. Wenn Sie beispielsweise nicht möchten, dass die im Verzeichnis /home vorhandenen Dateien Teil Ihres Images sind, müssen Sie diese löschen. Stellen Sie die Partitionen bereit, die Sie anpassen möchten, und ändern Sie die gewünschten Daten auf dem Laufwerk. Anschließend heben Sie die Bereitstellung der Festplatte auf.

    1. Erstellen Sie ein Verzeichnis zum Bereitstellen Ihres Laufwerks oder Ihrer Partition.

      sudo mkdir /mnt/image-disk
    2. Verwenden Sie den Befehl ls, um festzustellen, welches Laufwerk oder welche Partition Sie bereitstellen müssen.

      ls /dev/disk/by-id/

      Der Befehl gibt eine Liste von Laufwerk-IDs und Partitionen aus. Das folgende Laufwerk verfügt beispielsweise über eine Partitionstabelle mit einer Partition. Die ID google-image-disk verweist auf das komplette Laufwerk, von dem Sie ein Image erstellen möchten. Die ID google-image-disk-part1 verweist auf die erste Partition dieses Laufwerks. Stellen Sie die Partition bereit, wenn Sie Änderungen am Laufwerk vornehmen wollen, und erstellen Sie anschließend ein Image des kompletten Laufwerks.

          google-image-disk
          google-image-disk-part1
          
    3. Stellen Sie das Laufwerk oder die Partition bereit. Wenn Ihr Laufwerk über eine Partitionstabelle verfügt, stellen Sie die einzelnen Partitionen Ihres Laufwerks bereit. Beispiel: google-image-disk-part1.

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

      Wenn Ihr Laufwerk im RAW-Format formatiert ist und keine Partitionstabelle besitzt, stellen Sie das komplette Laufwerk google-image-disk bereit.

          sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. Passen Sie die Dateien im Verzeichnis /mnt/image-disk an, um die Dateien auf dem Laufwerk zu konfigurieren. Unter Umständen können Sie die Datei /mnt/image-disk/home/[USER]/.ssh/authorized_keys entfernen, damit Ihre SSH-Schlüssel nicht freigegeben werden.

    5. Heben Sie die Bereitstellung des Laufwerks auf, nachdem Sie die Dateien angepasst haben.

      sudo umount /mnt/image-disk/
  9. Erstellen Sie eine TAR-Datei aus Ihrem Image.

    Wenn Sie mit der Anpassung Ihrer Dateien fertig sind, erstellen Sie auf Ihrem temporären Laufwerk eine Raw-Disk-Datei. Die Bezeichnung des Raw-Disk-Images muss 'disk.raw‘ lauten:

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

    Wandeln Sie die Datei anschließend in eine TAR- und GZIP-Datei um:

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    Mit diesem Befehl wird an folgendem Speicherort ein Image der Instanz erstellt:

    /mnt/tmp/myimage.tar.gz

  10. Image in Cloud Storage hochladen

    Verwenden Sie zum Hochladen der TAR-Datei in Cloud Storage das gsutil-Befehlszeilentool, das auf Ihrer Instanz vorinstalliert ist.

    1. Erstellen Sie mit gsutil einen Bucket.

      Lesen Sie sich vor dem Erstellen des Buckets die Bucket- und Benennungsrichtlinien durch. Anschließend erstellen Sie Ihren Bucket mit dem folgenden Befehl. Ersetzen Sie dabei bucket-name durch den Namen des zu erstellenden Buckets.

          me@example-instance:~$ 
          gsutil mb gs://bucket-name
    2. Kopieren Sie die Datei in Ihren neuen Bucket. Ersetzen Sie dabei bucket-name durch den Namen des Buckets, in den die Datei kopiert werden soll.

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

Sie haben Ihre Datei zu Cloud Storage exportiert. Sie können das Image nun für andere Nutzer freigeben oder die TAR-Datei verwenden, um einem Google Cloud Console-Projekt ein neues Image hinzuzufügen.

Nächste Schritte