Exercice - Convertir et migrer des ressources

Effectué

Important

Vous avez besoin de votre propre abonnement Azure pour exécuter cet exercice et des frais pourraient vous être facturés. Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Votre entreprise de fabrication de jouets a acquis un concurrent qui a créé un camion jouet qui a du succès. Les jouets se connectent à une machine virtuelle hébergée dans Azure pour recevoir les mises à jour du microprogramme. Toutes les ressources de la machine virtuelle ont été créées manuellement en utilisant le portail Azure. Dans cette unité, vous allez commencer le processus de migration des ressources vers un fichier Bicep.

Au cours du processus, vous allez effectuer les tâches suivantes :

  • Déployer une machine virtuelle en utilisant le portail Azure.
  • Exporter les ressources de la machine virtuelle vers un modèle JSON.
  • Décompiler le modèle JSON en Bicep.
  • Créez un fichier Bicep et déplacez les ressources à partir du modèle décompilé.

Cet exercice utilise l’extension Bicep pour Visual Studio Code. Assurez-vous d’installer cette extension dans Visual Studio Code.

Création d’une machine virtuelle à l’aide du portail Azure

Pour simuler la situation dans l’exemple de scénario, vous allez commencer par déployer une machine virtuelle en utilisant le portail Azure.

  1. Connectez-vous au portail Azure.

  2. Dans la page d’accueil Azure, sous Services Azure, sélectionnez Créer une ressource :

    Capture d’écran montrant le portail Azure. L’option Créer une ressource est mise en surbrillance.

    La Place de marché Azure apparaît dans le volet Créer une ressource.

  3. Sous Ubuntu Server 20.04 LTS, sélectionnez Créer :

    Capture d’écran montrant la Place de marché Azure. Le lien Créer sous Ubuntu Server 20.04 LTS est mis en surbrillance.

    Important

    Si vous ne voyez pas Ubuntu Server 20.04 LTS, accédez directement à Ubuntu Server 20.04 LTS dans la Place de marché Azure.

  4. Sous l’onglet Informations de base, entrez les valeurs suivantes pour chaque paramètre. Utilisez les valeurs par défaut pour tous les autres paramètres.

    Paramètre Valeur
    Détails du projet
    Resource group Sélectionnez Créer, puis entrez ToyTruck.
    Détails de l’instance
    Nom de la machine virtuelle ToyTruckServer
    Région (États-Unis) USA Ouest 3
    Options de disponibilité Aucune redondance de l’infrastructure requise
    Image Ubuntu Server 20.04 LTS - x64 Gen2
    Taille Standard_D2s_v3
    Compte administrateur
    Type d'authentification Mot de passe
    Nom d’utilisateur toytruckadmin
    Mot de passe Entrez un mot de passe
    Règles des ports d’entrée
    Aucun port d’entrée public Aucun
  5. Sous l’onglet Gestion, vérifiez que Activer l’arrêt automatique n’est pas sélectionné.

  6. Sélectionnez Vérifier + créer. Azure valide vos paramètres. Vous risquez de devoir entrer ou sélectionner plus d’informations en fonction des conditions requises de l’image.

  7. Sélectionnez Créer pour déployer et créer la machine virtuelle.

    Le portail Azure montre la progression du déploiement.

  8. Une fois le déploiement terminé, sélectionnez le nom du groupe de ressources pour ouvrir celui-ci :

    Capture d’écran du portail Azure montrant le déploiement. Le nom du groupe de ressources est mis en surbrillance.

    Le groupe de ressources contient maintenant la machine virtuelle et ses dépendances :

    Capture d’écran du portail Azure qui montre le groupe de ressources.

Exporter le contenu du groupe de ressources vers un modèle JSON

  1. Dans le menu de gauche, sous Automatisation, sélectionnez Exporter le modèle :

    Capture d’écran du portail Azure qui montre l’élément de menu Exporter le modèle dans le volet du groupe de ressources.

    Un modèle JSON est généré. Le processus peut prendre une minute ou deux.

  2. Sélectionnez le bouton Télécharger :

    Capture d’écran du portail Azure montrant le modèle JSON du groupe de ressources exporté, avec le bouton Télécharger mis en évidence.

    Le modèle JSON et le fichier de paramètres sont téléchargés sur votre ordinateur sous la forme d’un fichier .zip.

  3. Décompressez le fichier dans un dossier auquel vous pouvez accéder facilement, par exemple votre Bureau.

  4. Ouvrez Visual Studio Code.

Préparer votre environnement local

  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est bash, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec l’option bash affichée.

  3. Si un interpréteur de commandes autre que bash apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis Azure Cloud Shell (Bash).

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée et l’option Git Bash par défaut sélectionnée.

  4. Dans la liste des interpréteurs de commandes de terminal, sélectionnez bash.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal bash sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    cd templates
    

Installer Bicep

Exécutez la commande suivante pour vous assurer de disposer de la dernière version de Bicep :

az bicep install && az bicep upgrade
  1. Dans le menu Terminal, sélectionnez Nouveau terminal. La fenêtre de terminal s’ouvre généralement dans la moitié inférieure de votre écran.

  2. Si l’interpréteur de commandes affiché sur le côté droit de la fenêtre de terminal est powershell ou pwsh, il s’agit du bon interpréteur de commandes qui est ouvert et vous pouvez passer à la section suivante.

    Capture d’écran de la fenêtre de terminal Visual Studio Code, avec l’option pwsh indiquée dans la liste déroulante de l’interpréteur de commande.

  3. Si un shell autre que powershell ou pwsh apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis PowerShell.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec la liste déroulante de l’interpréteur de commande affichée avec PowerShell sélectionné.

  4. Dans la liste d’interpréteurs de commandes de terminal, sélectionnez powershell ou pwsh.

    Capture d’écran de la fenêtre de terminal Visual Studio Code avec le terminal PowerShell sélectionné.

  5. Dans le terminal, accédez au répertoire où vous avez enregistré votre modèle. Par exemple, si vous avez enregistré votre modèle dans le dossier templates, vous pouvez utiliser la commande suivante :

    Set-Location -Path templates
    

Installer l’interface CLI Bicep

Pour utiliser Bicep à partir d’Azure PowerShell, installez l’interface CLI de Bicep.

Décompiler le modèle JSON en Bicep

Utilisez la commande decompile pour créer un fichier Bicep à partir du modèle :

az bicep decompile --file template.json

L’opération de décomposition génère un avertissement similaire à celui-ci :

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.

Utilisez la commande decompile pour créer un fichier Bicep à partir du modèle :

bicep decompile template.json

L’opération de décomposition génère un avertissement similaire à celui-ci :

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.

Inspecter le fichier Bicep décompilé

Ouvrez le fichier template.bicep dans Visual Studio Code et passez-le en revue. Notez qu’il s’agit d’un fichier Bicep valide, mais qu’il présente quelques problèmes, notamment :

  • Les noms symboliques qui sont donnés aux paramètres et aux ressources incluent des traits de soulignement et ne sont pas faciles à comprendre.
  • La propriété location est codée en dur dans toutes les définitions de ressource.
  • Le modèle comprend des valeurs codées en dur qui doivent être des paramètres ou être définies automatiquement par Azure.

Vous allez corriger ces problèmes dans le reste de ce module.

Créer un fichier Bicep

  1. Dans Visual Studio Code, créez un fichier appelé main.bicep.

  2. Enregistrez le fichier vide afin que Visual Studio Code charge les outils Bicep.

    Vous pouvez soit sélectionner Fichier >Enregistrer sous, soit Ctrl+S dans Windows (⌘+S dans macOS).

  3. Fractionnez l’éditeur pour voir les deux fichiers en même temps (le fichier template.bicep dans le volet gauche et le fichier main.bicep dans le volet droit).

    1. Sélectionnez l’onglet main.bicep.
    2. Sélectionnez Afficher>Disposition de l’éditeur>Fractionner à droite pour ouvrir l’onglet main.bicep dans le volet de droite.
    3. Fermez l’onglet main.bicep dans le volet de gauche.

    Capture d’écran de l’éditeur Visual Studio Code divisé qui montre le fichier template.bicep dans le volet gauche et le fichier main.bicep dans le volet droit.

Copier chaque élément dans votre nouveau fichier Bicep

  1. Copiez la ressource nommée networkSecurityGroups_ToyTruckServer_nsg_name_resource depuis le fichier template.bicep dans le fichier main.bicep.

    Notez quand vous le copiez que la propriété securityRules est vide. Plus loin dans ce module, vous allez refactoriser le fichier pour supprimer les propriétés redondantes.

  2. Visual Studio Code indique une erreur parce que le paramètre networkSecurityGroups_ToyTruckServer_nsg_name est manquant :

    Capture d’écran de l’éditeur Visual Studio Code qui montre la ressource migrée, avec une info-bulle affichant une erreur en raison du paramètre manquant.

    Copiez le paramètre dans le fichier main.bicep.

  3. Répétez le processus avec les ressources suivantes et leurs paramètres associés :

    • publicIPAddresses_ToyTruckServer_ip_name_resource
    • virtualMachines_ToyTruckServer_name_resource
    • virtualNetworks_ToyTruck_vnet_name_resource
    • virtualNetworks_ToyTruck_vnet_name_default
    • networkInterfaces_toytruckserver890_name_resource

    Notes

    Les noms des ressources dans votre déploiement peuvent être différents des ressources listées ici. Recherchez les ressources dont le nom est proche de ces noms.

    Quand vous copiez chaque ressource, examinez ses propriétés. Plus loin dans ce module, vous allez mettre à jour les propriétés et la configuration de chaque ressource pour qu’elles soient conformes aux bonnes pratiques de Bicep.

    Conseil

    Quand vous convertissez ou que vous exportez vos propres modèles, vous pouvez mettre à jour les ressources de façon à suivre les meilleures pratiques au fur et à mesure de leur copie. Dans ce module, nous mettons à jour les ressources séparément pour faciliter la compréhension de chaque phase du processus de migration.

Rechercher les ressources manquantes

  1. Dans le portail Azure, ouvrez le groupe de ressources ToyTruck.

  2. Passez en revue la liste des ressources et comparez-la à la liste des ressources de votre fichier Bicep. Notez que le groupe de ressources contient une ressource Disque qui n’est pas définie en tant que resource dans votre fichier Bicep :

    Capture d’écran du portail Azure qui montre le groupe de ressources, avec la ressource de disque mise en évidence.

    Quand vous travaillez avec des machines virtuelles dans Bicep, vous n’avez pas besoin de définir explicitement la ressource de disque managé. Au lieu de cela, vous définissez les propriétés de la machine virtuelle, tandis qu’Azure crée automatiquement pour vous le disque managé. Dans cet exemple, vous n’avez pas à vous soucier du fait que la ressource de disque n’est pas définie dans le fichier Bicep.

Vérification du modèle

À la fin de la phase de migration, votre fichier main.bicep doit être similaire à cet exemple :

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'
  }
}

Notes

Quelques éléments peuvent être différents dans votre modèle, notamment des noms symboliques, des versions d’API et les adresses IP. C’est normal. Vous allez résoudre certaines de ces différences plus loin dans le module.

Vous avez créé un fichier Bicep initial pour représenter vos ressources. Le fichier Bicep n’est pas bien structuré et ne suit pas les bonnes pratiques. Dans l’unité suivante, vous apprendrez comment améliorer la qualité du modèle migré.

Conseil

Si vous utilisez un système de gestion de versions comme Git, c’est le bon moment pour commiter votre travail.

Après avoir vérifié votre fichier main.bicep, fermez le fichier template.bicep.