Exercice - Convertir et migrer des ressources
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.
Connectez-vous au portail Azure.
Dans la page d’accueil Azure, sous Services Azure, sélectionnez Créer une ressource :
La Place de marché Azure apparaît dans le volet Créer une ressource.
Sous Ubuntu Server 20.04 LTS, sélectionnez Créer :
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.
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 Sous l’onglet Gestion, vérifiez que Activer l’arrêt automatique n’est pas sélectionné.
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.
Sélectionnez Créer pour déployer et créer la machine virtuelle.
Le portail Azure montre la progression du déploiement.
Une fois le déploiement terminé, sélectionnez le nom du groupe de ressources pour ouvrir celui-ci :
Le groupe de ressources contient maintenant la machine virtuelle et ses dépendances :
Exporter le contenu du groupe de ressources vers un modèle JSON
Dans le menu de gauche, sous Automatisation, sélectionnez Exporter le modèle :
Un modèle JSON est généré. Le processus peut prendre une minute ou deux.
Sélectionnez le bouton Télécharger :
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.
Décompressez le fichier dans un dossier auquel vous pouvez accéder facilement, par exemple votre Bureau.
Ouvrez Visual Studio Code.
Préparer votre environnement local
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.
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.
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).
Dans la liste des interpréteurs de commandes de terminal, sélectionnez bash.
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
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.
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.
Si un shell autre que powershell ou pwsh apparaît, sélectionnez la flèche déroulante des interpréteurs de commandes, puis PowerShell.
Dans la liste d’interpréteurs de commandes de terminal, sélectionnez powershell ou pwsh.
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
Dans Visual Studio Code, créez un fichier appelé main.bicep.
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).
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).
- Sélectionnez l’onglet main.bicep.
- Sélectionnez Afficher>Disposition de l’éditeur>Fractionner à droite pour ouvrir l’onglet main.bicep dans le volet de droite.
- Fermez l’onglet main.bicep dans le volet de gauche.
Copier chaque élément dans votre nouveau fichier Bicep
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.Visual Studio Code indique une erreur parce que le paramètre
networkSecurityGroups_ToyTruckServer_nsg_name
est manquant :Copiez le paramètre dans le fichier main.bicep.
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
Dans le portail Azure, ouvrez le groupe de ressources ToyTruck.
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 :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.