Übung: Konvertieren und Migrieren von Ressourcen

Abgeschlossen

Wichtig

Sie benötigen für diese Übung ein eigenes Azure-Abonnement. Außerdem fallen möglicherweise Gebühren für Sie an. Wenn Sie noch kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

Ihr Spielzeugunternehmen hat einen Konkurrenten aufgekauft, der einen beliebten Spielzeug-LKW herstellt. Die Spielzeuge stellen eine Verbindung mit einer in Azure gehosteten VM her, um Firmwareupdates zu erhalten. Alle Ressourcen für den virtuellen Computer wurden manuell mithilfe des Azure-Portals erstellt. In dieser Lerneinheit beginnen Sie mit dem Migrieren der Ressourcen zu einer Bicep-Datei.

Während des Prozesses führen Sie die folgenden Aufgaben aus:

  • Stellen Sie einen neuen virtuellen Computer über das Azure-Portal bereit.
  • Exportieren Sie die Ressourcen des virtuellen Computers in eine JSON-Vorlage.
  • Dekompilieren Sie die JSON-Vorlage in Bicep.
  • Erstellen Sie eine neue Bicep-Datei, und verschieben Sie die Ressourcen aus der dekompilierten Vorlage.

In dieser Übung wird die Bicep-Erweiterung für Visual Studio Code verwendet. Sie müssen diese Erweiterung in Visual Studio Code installieren.

Erstellen eines virtuellen Computers mit dem Azure-Portal

Stellen Sie zunächst einen virtuellen Computer mithilfe des Azure-Portals bereit, um die Situation im Beispielszenario zu simulieren.

  1. Melden Sie sich beim Azure-Portal an.

  2. Wählen Sie auf der Azure-Startseite unter Azure-Dienste die Option Ressource erstellen aus:

    Screenshot des Azure-Portals. Die Option „Ressource erstellen“ ist hervorgehoben.

    Azure Marketplace wird im Bereich Ressource erstellen angezeigt.

  3. Wählen Sie unter Ubuntu Server 20.04 LTS die Option Erstellen aus:

    Screenshot des Azure Marketplace. Der Link „Erstellen“ unter Ubuntu Server 20.04 LTS ist hervorgehoben.

    Wichtig

    Wenn Ubuntu Server 20.04 LTS nicht angezeigt wird, wechseln Sie direkt zu Ubuntu Server 20.04 LTS im Azure Marketplace.

  4. Füllen Sie auf der Registerkarte Grundlagen die folgenden Felder für jede Einstellung aus. Verwenden Sie für alle anderen Einstellungen die Standardwerte.

    Einstellung Wert
    Projektdetails
    Resource group Wählen Sie Neu erstellen aus, und geben Sie ToyTruck ein.
    Instanzendetails
    Name des virtuellen Computers ToyTruckServer
    Region (USA) USA, Westen 3
    Verfügbarkeitsoptionen Keine Infrastrukturredundanz erforderlich
    Abbildung Ubuntu Server 20.04 LTS – x64 Gen2
    Größe Standard_D2s_v3
    Administratorkonto
    Authentifizierungsart Kennwort
    Username toytruckadmin
    Kennwort Geben Sie ein Kennwort ein.
    Regeln für eingehende Ports
    Öffentliche Eingangsports Keine
  5. Stellen Sie auf der Registerkarte Verwaltung sicher, dass Automatisches Herunterfahren aktivieren nicht ausgewählt ist.

  6. Klicken Sie auf Überprüfen + erstellen. Azure überprüft Ihre Einstellungen. Abhängig von den Imageanforderungen müssen Sie möglicherweise weitere Informationen eingeben oder auswählen.

  7. Wählen Sie Erstellen aus, um die VM bereitzustellen und zu erstellen.

    Das Azure-Portal zeigt die Bereitstellung an, während sie ausgeführt wird.

  8. Wählen Sie nach Abschluss der Bereitstellung den Namen der Ressourcengruppe aus, um diese zu öffnen:

    Screenshot der Bereitstellung im Azure-Portal. Der Name der Ressourcengruppe ist hervorgehoben.

    Die Ressourcengruppe enthält jetzt den virtuellen Computer und seine Abhängigkeiten.

    Screenshot: Bereich, der die Ressourcengruppe im Azure-Portal anzeigt

Exportieren der Ressourcengruppeninhalte in eine JSON-Vorlage

  1. Wählen Sie im Menü links unter Automation die Option Vorlage exportieren aus:

    Screenshot des Azure-Portals: Menüelement „Vorlage exportieren“ im Bereich „Ressourcengruppe“

    Eine JSON-Vorlage wird generiert. Es kann ein oder zwei Minuten dauern, bis der Prozess abgeschlossen ist.

  2. Wählen Sie die Schaltfläche Herunterladen aus:

    Screenshot des Azure-Portals mit der exportierten JSON-Vorlage der Ressourcengruppe mit hervorgehobener Schaltfläche „Herunterladen“

    Die JSON-Vorlage und die Parameterdatei werden als ZIP-Datei auf Ihren Computer heruntergeladen.

  3. Entzippen Sie die Datei in einen Ordner, auf den Sie problemlos zugreifen können, z. B. auf Ihren Desktop.

  4. Öffnen Sie Visual Studio Code.

Vorbereiten der lokalen Umgebung

  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell bash ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Visual Studio Code-Terminalfensters mit Option „bash“

  3. Wenn eine andere Shell als bash angezeigt wird, wählen Sie die Shell-Dropdownliste und dann Azure Cloud Shell (Bash) aus.

    Screenshot des Visual Studio Code-Terminalfensters mit dem Dropdownmenü für die Terminalshell und Auswahl von „Git Bash (Standard)“

  4. Wählen Sie in der Liste der Terminalshells bash aus.

    Screenshot: Visual Studio Code-Terminalfenster mit „bash“ als ausgewähltem Terminal

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    cd templates
    

Installieren von Bicep

Vergewissern Sie sich mit dem folgenden Befehl, dass Sie die aktuelle Version von Bicep verwenden:

az bicep install && az bicep upgrade
  1. Wählen Sie im Menü Terminal die Option New Terminal (Neues Terminal) aus. Das Terminalfenster wird in der Regel in der unteren Hälfte des Bildschirms geöffnet.

  2. Wenn die auf der rechten Seite des Terminalfensters angezeigte Shell powershell oder pwsh ist, ist die richtige Shell geöffnet, und Sie können mit dem nächsten Abschnitt fortfahren.

    Screenshot des Terminalfensters von Visual Studio Code mit der Option „pwsh“ in der Shell-Dropdown-Liste.

  3. Wenn eine andere Shell als powershell oder pwsh angezeigt wird, wählen Sie die Shell-Dropdownliste und dann PowerShell aus.

    Screenshot des Terminalfensters von Visual Studio Code mit der Dropdown-Liste der Terminal-Shell und der Auswahl von PowerShell.

  4. Wählen Sie in der Liste der Terminalshells powershell oder pwsh aus.

    Screenshot des Visual Studio Code-Terminalfensters mit „PowerShell“ als ausgewähltem Terminal.

  5. Wechseln Sie im Terminal zu dem Verzeichnis, in dem Sie Ihre Vorlage gespeichert haben. Wenn Sie Ihre Vorlage beispielsweise im Ordner templates gespeichert haben, können Sie den folgenden Befehl verwenden:

    Set-Location -Path templates
    

Installieren der Bicep CLI

Installieren Sie die Bicep-CLI, um Bicep über Azure PowerShell zu verwenden.

Dekompilieren der JSON-Vorlage in Bicep

Führen Sie den Befehl decompile aus, um eine Bicep-Datei aus der Vorlage zu erstellen:

az bicep decompile --file template.json

Der Dekompilierungsvorgang generiert eine Warnung ähnlich der folgenden:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Führen Sie den Befehl decompile aus, um eine Bicep-Datei aus der Vorlage zu erstellen:

bicep decompile template.json

Der Dekompilierungsvorgang generiert eine Warnung ähnlich der folgenden:

WARNING: Decompilation is a best-effort process, as there is no guaranteed mapping from ARM JSON
 to Bicep.

You might need to fix warnings and errors in the generated bicep file(s), or decompilation might fail
 entirely if an accurate conversion is not possible.

If you would like to report any issues or inaccurate conversions,
please see https://github.com/Azure/bicep/issues.

Untersuchen der dekompilierten Bicep-Datei

Öffnen Sie die Datei template.bicep in Visual Studio Code, und lesen Sie sie durch. Beachten Sie, dass es sich um eine gültige Bicep-Datei handelt, die aber einige Probleme aufweist, z. B.:

  • Die symbolischen Namen, die Parametern und Ressourcen gegeben werden, enthalten Unterstriche und sind nicht leicht verständlich.
  • Die location-Eigenschaft ist in allen Ressourcendefinitionen hartcodiert.
  • Die Vorlage enthält hartcodierte Werte, die entweder Parameter sein oder automatisch von Azure festgelegt werden sollen.

Sie beheben diese Probleme im weiteren Verlauf dieses Moduls.

Erstellen einer neuen Bicep-Datei

  1. Erstellen Sie in Visual Studio Code eine neue Datei mit dem Namen main.bicep.

  2. Speichern Sie die leere Datei, damit Visual Studio Code die Bicep-Tools lädt.

    Sie können entweder Datei>Speichern unter auswählen oder STRG+S unter Windows (⌘+S unter macOS) drücken.

  3. Teilen Sie den Editor so, dass Sie beide Dateien gleichzeitig sehen können (die Datei template.bicep im linken Bereich und die Datei main.bicep im rechten Bereich).

    1. Wählen Sie die Registerkarte main.bicep aus.
    2. Wählen Sie Ansicht>Editorlayout>Rechts teilen aus, um die Registerkarte main.bicep im rechten Bereich zu öffnen.
    3. Schließen Sie die Registerkarte main.bicep im linken Bereich.

    Screenshot: Geteilter Visual Studio Code-Editor mit der Datei „template.bicep“ im linken Bereich und der Datei „main.bicep“ im rechten Bereich

Kopieren der einzelnen Elemente in die neue Bicep-Datei

  1. Kopieren Sie die Ressource namens networkSecurityGroups_ToyTruckServer_nsg_name_resource aus der Datei template.bicep in die Datei main.bicep.

    Beachten Sie beim Kopieren, dass die securityRules Eigenschaft leer ist. Später in diesem Modul werden Sie die Datei umgestalten, um redundante Eigenschaften zu entfernen.

  2. Visual Studio Code gibt einen Fehler an, weil der networkSecurityGroups_ToyTruckServer_nsg_name-Parameter fehlt:

    Screenshot: Visual Studio Code-Editor mit der migrierten Ressource mit einer QuickInfo, die einen Fehler aufgrund des fehlenden Parameters anzeigt

    Kopieren Sie den Parameter in die Datei main.bicep.

  3. Wiederholen Sie den Vorgang mit den folgenden Ressourcen und ihren zugehörigen Parametern:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Hinweis

    Die Namen der Ressourcen in Ihrer Bereitstellung können sich von den hier aufgeführten Ressourcen unterscheiden. Suchen Sie nach Ressourcen mit Namen, die diesen hier ähnlich sind.

    Überprüfen Sie beim Kopieren der einzelnen Ressourcen deren Eigenschaften. Später in diesem Modul aktualisieren Sie die Eigenschaften und die Konfiguration jeder Ressource, um bewährte Methoden von Bicep zu befolgen.

    Tipp

    Wenn Sie Ihre eigenen Vorlagen konvertieren oder exportieren, können Sie die Ressourcen aktualisieren, um beim Kopieren bewährte Methoden zu befolgen. In diesem Modul werden die Ressourcen separat aktualisiert, um die einzelnen Phasen des Migrationsprozesses zu verdeutlichen.

Überprüfen auf fehlende Ressourcen

  1. Öffnen Sie im Azure-Portal die Ressourcengruppe ToyTruck.

  2. Überprüfen Sie die Liste der Ressourcen, und vergleichen Sie sie mit der Liste der Ressourcen in Ihrer Bicep-Datei. Beachten Sie, dass die Ressourcengruppe eine Ressource Disk enthält, die in Ihrer Bicep-Datei nicht als resource definiert ist:

    Screenshot des Azure-Portals: Ressourcengruppe mit hervorgehobener Ressource „Disk“

    Wenn Sie mit virtuellen Computern in Bicep arbeiten, müssen Sie die verwaltete Datenträgerressource nicht explizit definieren. Stattdessen definieren Sie Eigenschaften des virtuellen Computers, und Azure erstellt den verwalteten Datenträger automatisch für Sie. In diesem Beispiel müssen Sie sich keine Sorgen machen, dass die Datenträgerressource nicht in der Bicep-Datei definiert ist.

Überprüfen der Vorlage

Am Ende der Migrationsphase sollte die Datei main.bicep in etwa wie folgt aussehen:

param virtualNetworks_ToyTruck_vnet_name string = 'ToyTruck-vnet'
param virtualMachines_ToyTruckServer_name string = 'ToyTruckServer'
param networkInterfaces_toytruckserver154_name string = 'toytruckserver154'
param publicIPAddresses_ToyTruckServer_ip_name string = 'ToyTruckServer-ip'
param networkSecurityGroups_ToyTruckServer_nsg_name string = 'ToyTruckServer-nsg'

resource networkSecurityGroups_ToyTruckServer_nsg_name_resource 'Microsoft.Network/networkSecurityGroups@2022-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2022-05-01' = {
  name: publicIPAddresses_ToyTruckServer_ip_name
  location: 'westus3'
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    ipAddress: '1.2.3.4'
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
}

resource virtualMachines_ToyTruckServer_name_resource 'Microsoft.Compute/virtualMachines@2022-08-01' = {
  name: virtualMachines_ToyTruckServer_name
  location: 'westus3'
  properties: {
    hardwareProfile: {
      vmSize: 'Standard_D2s_v3'
    }
    storageProfile: {
      imageReference: {
        publisher: 'canonical'
        offer: '0001-com-ubuntu-server-focal'
        sku: '20_04-lts-gen2'
        version: 'latest'
      }
      osDisk: {
        osType: 'Linux'
        name: '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81'
        createOption: 'FromImage'
        caching: 'ReadWrite'
        managedDisk: {
          storageAccountType: 'Premium_LRS'
          id: resourceId('Microsoft.Compute/disks', '${virtualMachines_ToyTruckServer_name}_disk1_23e6a144c4ea4049b3e2be24b78a9e81')
        }
        deleteOption: 'Delete'
        diskSizeGB: 30
      }
      dataDisks: []
    }
    osProfile: {
      computerName: virtualMachines_ToyTruckServer_name
      adminUsername: 'toytruckadmin'
      linuxConfiguration: {
        disablePasswordAuthentication: false
        provisionVMAgent: true
        patchSettings: {
          patchMode: 'ImageDefault'
          assessmentMode: 'ImageDefault'
        }
        enableVMAgentPlatformUpdates: false
      }
      secrets: []
      allowExtensionOperations: true
      requireGuestProvisionSignal: true
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: networkInterfaces_toytruckserver154_name_resource.id
          properties: {
            deleteOption: 'Detach'
          }
        }
      ]
    }
    diagnosticsProfile: {
      bootDiagnostics: {
        enabled: true
      }
    }
  }
}

resource virtualNetworks_ToyTruck_vnet_name_resource 'Microsoft.Network/virtualNetworks@2022-05-01' = {
  name: virtualNetworks_ToyTruck_vnet_name
  location: 'westus3'
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'default'
        id: virtualNetworks_ToyTruck_vnet_name_default.id
        properties: {
          addressPrefix: '10.0.0.0/24'
          delegations: []
          privateEndpointNetworkPolicies: 'Disabled'
          privateLinkServiceNetworkPolicies: 'Enabled'
        }
        type: 'Microsoft.Network/virtualNetworks/subnets'
      }
    ]
    virtualNetworkPeerings: []
    enableDdosProtection: false
  }
}

resource virtualNetworks_ToyTruck_vnet_name_default 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  name: '${virtualNetworks_ToyTruck_vnet_name}/default'
  properties: {
    addressPrefix: '10.0.0.0/24'
    delegations: []
    privateEndpointNetworkPolicies: 'Disabled'
    privateLinkServiceNetworkPolicies: 'Enabled'
  }
  dependsOn: [
    virtualNetworks_ToyTruck_vnet_name_resource
  ]
}

resource networkInterfaces_toytruckserver154_name_resource 'Microsoft.Network/networkInterfaces@2022-05-01' = {
  name: networkInterfaces_toytruckserver154_name
  location: 'westus3'
  kind: 'Regular'
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
        etag: 'W/"6a38849d-bd59-4eae-856e-4909f7ac1fac"'
        type: 'Microsoft.Network/networkInterfaces/ipConfigurations'
        properties: {
          provisioningState: 'Succeeded'
          privateIPAddress: '10.0.0.4'
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            name: 'ToyTruckServer-ip'
            id: publicIPAddresses_ToyTruckServer_ip_name_resource.id
            properties: {
              provisioningState: 'Succeeded'
              resourceGuid: '07079685-0980-4ddf-acc3-3c8797c94b9a'
              publicIPAddressVersion: 'IPv4'
              publicIPAllocationMethod: 'Dynamic'
              idleTimeoutInMinutes: 4
              ipTags: []
              ipConfiguration: {
                id: '${networkInterfaces_toytruckserver154_name_resource.id}/ipConfigurations/ipconfig1'
              }
              deleteOption: 'Detach'
            }
            type: 'Microsoft.Network/publicIPAddresses'
            sku: {
              name: 'Basic'
              tier: 'Regional'
            }
          }
          subnet: {
            id: virtualNetworks_ToyTruck_vnet_name_default.id
          }
          primary: true
          privateIPAddressVersion: 'IPv4'
        }
      }
    ]
    dnsSettings: {
      dnsServers: []
    }
    enableAcceleratedNetworking: true
    enableIPForwarding: false
    disableTcpStateTracking: false
    networkSecurityGroup: {
      id: networkSecurityGroups_ToyTruckServer_nsg_name_resource.id
    }
    nicType: 'Standard'
  }
}

Hinweis

Einige Dinge können sich in Ihrer Vorlage unterscheiden, darunter einige symbolische Namen, API-Versionen und die IP-Adressen. Das ist in Ordnung. Sie lösen einige dieser Diskrepanzen später im Modul auf.

Sie haben eine erste Bicep-Datei erstellt, die Ihre Ressourcen darstellt. Die Bicep-Datei ist nicht gut strukturiert und entspricht nicht bewährten Methoden. In der nächsten Lerneinheit erfahren Sie, wie Sie die Qualität der migrierten Vorlage verbessern.

Tipp

Wenn Sie ein Versionskontrollsystem wie Git verwenden, wäre dies ein guter Zeitpunkt, um Ihre Arbeit zu committen.

Nachdem Sie die Datei main.bicep überprüft haben, schließen Sie die Datei template.bicep.