Övning – Konvertera och migrera resurser

Slutförd

Viktigt!

Du behöver en egen Azure-prenumeration för att utföra den här övningen, och avgifter kan tillkomma. Om du inte redan har en Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.

Ditt leksaksföretag har förvärvat en konkurrent som skapat en populär leksaksbil. Leksakerna ansluter till en virtuell dator som finns i Azure för att ta emot uppdateringar av inbyggd programvara. Alla resurser för den virtuella datorn skapades manuellt med hjälp av Azure Portal. I den här lektionen börjar du migrera resurserna till en Bicep-fil.

Under processen utför du följande uppgifter:

  • Distribuera en ny virtuell dator med hjälp av Azure Portal.
  • Exportera de virtuella datorresurserna till en JSON-mall.
  • Dela upp JSON-mallen till Bicep.
  • Skapa en ny Bicep-fil och flytta resurserna från den dekompilerade mallen.

Den här övningen använder Bicep-tillägget för Visual Studio Code. Installera tillägget i Visual Studio Code.

Skapa en virtuell dator med hjälp av Azure Portal

Om du vill simulera situationen i exempelscenariot distribuerar du först en virtuell dator med hjälp av Azure Portal.

  1. Logga in på Azure-portalen.

  2. På Azures startsida går du till Azure-tjänster och väljer Skapa en resurs:

    Skärmbild som visar Azure Portal. Alternativet Skapa en resurs är markerat.

    Azure Marketplace visas i fönstret Skapa en resurs .

  3. Under Ubuntu Server 20.04 LTS väljer du Skapa:

    Skärmbild som visar Azure Marketplace. Länken Skapa under Ubuntu Server 20.04 LTS är markerad.

    Viktigt!

    Om du inte ser Ubuntu Server 20.04 LTS går du direkt till Ubuntu Server 20.04 LTS på Azure Marketplace.

  4. På fliken Grundläggande anger du följande värden för varje inställning. Använd standardinställningarna för alla andra inställningar.

    Inställning Värde
    Projektinformation
    Resursgrupp Välj Skapa ny och ange ToyTruck
    Instansinformation
    Virtual machine name ToyTruckServer
    Region (USA) USA, västra 3
    Tillgängliga alternativ Ingen infrastrukturredundans krävs
    Bild Ubuntu Server 20.04 LTS – x64 Gen2
    Storlek Standard_D2s_v3
    Administratörskonto
    Authentication type Lösenord
    Username toytruckadmin
    Lösenord Ange ett lösenord
    Regler för inkommande portar
    Offentliga inkommande portar Ingen
  5. På fliken Hantering kontrollerar du att Aktivera automatisk avstängning inte är markerat.

  6. Välj Granska + skapa. Azure validerar dina inställningar. Du kan behöva ange eller välja mer information beroende på bildkraven.

  7. Välj Skapa för att distribuera och skapa den virtuella datorn.

    Azure Portal visar distributionen medan den pågår.

  8. När distributionen är klar väljer du resursgruppens namn för att öppna resursgruppen:

    Skärmbild av Azure Portal som visar distributionen. Resursgruppens namn är markerat.

    Resursgruppen innehåller nu den virtuella datorn och dess beroenden:

    Skärmbild av Azure Portal som visar resursgruppen.

Exportera resursgruppens innehåll till en JSON-mall

  1. I den vänstra menyn, under Automation, väljer du Exportera mall:

    Skärmbild av Azure Portal som visar menyalternativet Exportera mall i resursgruppsfönstret.

    En JSON-mall genereras. Det kan ta en minut eller två för processen att slutföras.

  2. Välj knappen Ladda ned:

    Skärmbild av Azure Portal som visar JSON-mallen för den exporterade resursgruppen med knappen Ladda ned markerad.

    JSON-mallen och parameterfilen laddas ned till datorn som en .zip fil.

  3. Packa upp filen till en mapp som du enkelt kan komma åt, till exempel skrivbordet.

  4. Öppna Visual Studio Code.

Förbereda din lokala miljö

  1. I menyn Terminal väljer du Ny terminal. Terminalfönstret öppnas vanligtvis på den nedre halvan av skärmen.

  2. Om terminalfönstret visar bash på höger sida innebär det att rätt gränssnitt redan är öppet. Om du ser en bash shell-ikon till höger kan du välja den för att starta gränssnittet.

    Skärmbild av terminalfönstret i Visual Studio Code, där bash-alternativet visas.

    Om ett annat gränssnitt än bash visas väljer du listrutepilen för gränssnittet och väljer sedan Git Bash.

    Skärmbild av terminalfönstret i Visual Studio Code, där listrutan terminalgränssnitt visas och Git Bash Default har valts.

  3. I terminalen går du till katalogen där du sparade mallen. Om du till exempel har sparat mallen i mallmappen kan du använda det här kommandot:

    cd templates
    

Installera Bicep

Kör följande kommando för att se till att du har den senaste versionen av Bicep:

az bicep install && az bicep upgrade
  1. I menyn Terminal väljer du Ny terminal. Terminalfönstret öppnas vanligtvis på den nedre halvan av skärmen.

  2. Om terminalfönstret visar pwsh eller powershell till höger betyder det att rätt gränssnitt redan är öppet. Om du ser en PowerShell-gränssnittsikon till höger kan du också välja den för att starta gränssnittet.

    Skärmbild av terminalfönstret i Visual Studio Code med pwsh-alternativet som visas i listrutan shell.

    Om ett annat gränssnitt än pwsh eller powershell visas väljer du listrutepilen shell och väljer sedan PowerShell.

    Skärmbild av Terminalfönstret i Visual Studio Code, med listrutan terminalgränssnitt som visas och PowerShell valt.

  3. I terminalen går du till katalogen där du sparade mallen. Om du till exempel har sparat mallen i mallmappen kan du använda det här kommandot:

    Set-Location -Path templates
    

Installera Bicep CLI

Om du vill använda Bicep från Azure PowerShell installerar du Bicep CLI.

Dela upp JSON-mallen till Bicep

decompile Använd kommandot för att skapa en Bicep-fil från mallen:

az bicep decompile --file template.json

Dekompileringsåtgärden genererar en varning som liknar den här:

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.

decompile Använd kommandot för att skapa en Bicep-fil från mallen:

bicep decompile template.json

Dekompileringsåtgärden genererar en varning som liknar den här:

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.

Granska den dekompilerade Bicep-filen

Öppna filen template.bicep i Visual Studio Code och läs igenom den. Observera att det är en giltig Bicep-fil, men den har några problem, bland annat:

  • De symboliska namn som ges till parametrar och resurser innehåller understreck och är inte lätta att förstå.
  • Egenskapen location är hårdkodad i alla resursdefinitioner.
  • Mallen innehåller hårdkodade värden som antingen ska vara parametrar eller ställas in automatiskt av Azure.

Du löser de här problemen under resten av den här modulen.

Skapa en ny Bicep-fil

  1. I Visual Studio Code skapar du en ny fil med namnet main.bicep.

  2. Spara den tomma filen så att Visual Studio Code läser in Bicep-verktyget.

    Du kan antingen välja Spara som-fil> eller välja Ctrl+S i Windows (⌘+S i macOS).

  3. Dela upp redigeraren så att du kan se båda filerna samtidigt ( filen template.bicep i det vänstra fönstret och filen main.bicep i den högra rutan).

    1. Välj fliken main.bicep .
    2. Välj Visa>redigerarens layout>dela höger för att öppna fliken main.bicep i det högra fönstret.
    3. Stäng fliken main.bicep i den vänstra rutan.

    Skärmbild av den delade Visual Studio Code-redigeraren som visar mallens dot bicep-fil i det vänstra fönstret och huvudpunktens bicep-fil i den högra rutan.

Kopiera varje element till din nya Bicep-fil

  1. Kopiera resursen med namnet networkSecurityGroups_ToyTruckServer_nsg_name_resource från filen template.bicep till filen main.bicep .

    Observera att egenskapen är tom när du kopierar den securityRules . Senare i den här modulen omstrukturerar du filen för att ta bort redundanta egenskaper.

  2. Visual Studio Code anger ett fel eftersom parametern networkSecurityGroups_ToyTruckServer_nsg_name saknas:

    Skärmbild av Visual Studio Code-redigeraren som visar den migrerade resursen, med en knappbeskrivning som visar ett fel på grund av den saknade parametern.

    Kopiera parametern till filen main.bicep .

  3. Upprepa processen med följande resurser och deras associerade parametrar:

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Kommentar

    Namnen på resurserna i distributionen kan skilja sig från de resurser som anges här. Leta reda på de resurser som har namn som ligger nära dessa namn.

    När du kopierar varje resurs kontrollerar du dess egenskaper. Senare i den här modulen uppdaterar du varje resurss egenskaper och konfiguration så att de överensstämmer med Biceps metodtips.

    Dricks

    När du konverterar eller exporterar dina egna mallar kan du uppdatera resurserna så att de följer metodtipsen när du kopierar dem. I den här modulen uppdaterar vi resurserna separat för att göra det enklare att förstå varje fas i migreringsprocessen.

Sök efter resurser som saknas

  1. Öppna resursgruppen ToyTruck i Azure Portal.

  2. Granska listan över resurser och jämför den med listan över resurser i Bicep-filen. Observera att resursgruppen innehåller en diskresurs som inte har definierats som en resource i Bicep-filen:

    Skärmbild av Azure Portal som visar resursgruppen med diskresursen markerad.

    När du arbetar med virtuella datorer i Bicep behöver du inte uttryckligen definiera den hanterade diskresursen. I stället definierar du egenskaperna för den virtuella datorn och Azure skapar den hanterade disken automatiskt. I det här exemplet behöver du inte oroa dig för att diskresursen inte har definierats i Bicep-filen.

Verifiera mallen

I slutet av migreringsfasen bör filen main.bicep se ut ungefär som i det här exemplet:

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@2024-05-01' = {
  name: networkSecurityGroups_ToyTruckServer_nsg_name
  location: 'westus3'
  properties: {
    securityRules: []
  }
}

resource publicIPAddresses_ToyTruckServer_ip_name_resource 'Microsoft.Network/publicIPAddresses@2024-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@2024-07-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@2024-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@2024-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@2024-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'
  }
}

Kommentar

Några saker kan skilja sig åt i mallen, inklusive några av de symboliska namnen, API-versionerna och IP-adresserna. Det gör ingenting. Du löser några av dessa avvikelser senare i modulen.

Du har skapat en första Bicep-fil som representerar dina resurser. Bicep-filen är inte väl strukturerad och följer inte metodtipsen. I nästa lektion får du lära dig hur du förbättrar kvaliteten på den migrerade mallen.

Dricks

Om du använder ett versionskontrollsystem som Git är det här ett bra tillfälle att genomföra ditt arbete.

När du har verifierat filen main.bicep stänger du filen template.bicep .