Décompilation du JSON d’un modèle ARM dans un fichier Bicep

Cet article explique comment décompiler des modèles Azure Resource Manager (modèles ARM) dans des fichiers Bicep. Vous devez installer l’interface CLI Bicep pour pouvoir exécuter les commandes de conversion.

Notes

Dans partir de Visual Studio Code, vous pouvez créer directement des déclarations de ressources en les important à partir de ressources existantes. Pour plus d’informations, consultez Commandes Bicep.

Visual Studio Code vous permet de coller du code JSON en tant que Bicep. Il exécute automatiquement la commande de décompilation. Pour plus d’informations, consultez Coller du code JSON en tant que Bicep.

La décompilation d’un modèle ARM vous aide à démarrer avec le développement Bicep. Si vous disposez d’une bibliothèque de modèles ARM et que vous souhaitez utiliser Bicep pour vos futures tâches de développement, vous pouvez les décompiler dans des fichiers Bicep. Toutefois, pour l’implémentation des bonnes pratiques Bicep, vous devrez peut-être réviser le fichier Bicep.

Cet article explique comment exécuter la commande decompile dans Azure CLI. Si vous n’utilisez pas Azure CLI, exécutez la commande sans az au début de celle-ci. Par exemple, az bicep decompile devient bicep decompile.

Décompiler du JSON dans un fichier Bicep

Pour décompiler le JSON d’un modèle ARM dans un fichier Bicep, utilisez ceci :

az bicep decompile --file main.json

La commande crée un fichier nommé main.bicep dans le répertoire que main.json. Si main.bicep existe dans le même répertoire, utilisez le commutateur --force pour remplacer le fichier Bicep existant.

Vous pouvez également décompiler le modèle ARM JSON en Bicep dans Visual Studio Code en utilisant la commande Decompile into Bicep. Pour plus d’informations, consultez Visual Studio Code.

Attention

La décompilation tente de convertir le fichier, mais il n’existe aucun mappage garanti entre le JSON du modèle ARM et Bicep. Vous devrez peut-être corriger des avertissements et des erreurs dans le fichier Bicep généré. Il est également possible que la décompilation échoue si une conversion exacte n’est pas possible. Pour signaler des problèmes ou des conversions inexactes, signalez un problème.

Les commandes decompile et build produisent des modèles qui sont équivalents d’un point de vue fonctionnel. Toutefois, ils ne sont pas nécessairement identiques dans l’implémentation. La conversion d’un modèle de JSON en Bicep, puis à nouveau en JSON, produit selon toute probabilité un modèle présentant une syntaxe différente de celle du modèle d’origine. Une fois déployés, les modèles convertis produisent les mêmes résultats.

Corriger les problèmes de conversion

Supposons que vous disposiez du modèle ARM suivant :

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ],
      "metadata": {
        "description": "Storage Account type"
      }
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location for all resources."
      }
    }
  },
  "variables": {
    "storageAccountName": "[concat('store', uniquestring(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],
  "outputs": {
    "storageAccountName": {
      "type": "string",
      "value": "[variables('storageAccountName')]"
    }
  }
}

Quand vous le décompilez, vous obtenez :

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
  'Premium_LRS'
])
@description('Storage Account type')
param storageAccountType string = 'Standard_LRS'

@description('Location for all resources.')
param location string = resourceGroup().location

var storageAccountName_var = 'store${uniqueString(resourceGroup().id)}'

resource storageAccountName 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: storageAccountName_var
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {}
}

output storageAccountName string = storageAccountName_var

Le fichier décompilé fonctionne, mais il contient des noms que vous souhaiterez peut-être changer. La variable var storageAccountName_var a une convention de nommage inhabituelle. Nous allons la remplacer par ceci :

var uniqueStorageName = 'store${uniqueString(resourceGroup().id)}'

Pour renommer un élément dans le fichier, cliquez avec le bouton droit sur le nom, puis sélectionnez Renommer le symbole. Vous pouvez également utiliser la touche d’accès rapide F2.

La ressource a un nom symbolique que vous souhaiterez peut-être changer. Au lieu de storageAccountName pour le nom symbolique, utilisez exampleStorage.

resource exampleStorage 'Microsoft.Storage/storageAccounts@2019-06-01' = {

Voici le fichier dans son intégralité :

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
  'Premium_LRS'
])
@description('Storage Account type')
param storageAccountType string = 'Standard_LRS'

@description('Location for all resources.')
param location string = resourceGroup().location

var uniqueStorageName = 'store${uniqueString(resourceGroup().id)}'

resource exampleStorage 'Microsoft.Storage/storageAccounts@2019-06-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {}
}

output storageAccountName string = uniqueStorageName

Exportation d’un modèle et conversion

Vous pouvez exporter le modèle pour un groupe de ressources, puis le passer directement à la commande decompile. L’exemple suivant montre comment décompiler un modèle exporté.

az group export --name "your_resource_group_name" > main.json
az bicep decompile --file main.json

Vue côte à côte

Bicep Playground vous permet de voir le modèle ARM et le fichier Bicep équivalent côte à côte. Vous pouvez sélectionner Exemple de modèle pour voir les deux versions. Vous pouvez également sélectionner Décompiler pour charger votre propre modèle ARM et voir le fichier Bicep équivalent.

Étapes suivantes

Pour en savoir plus sur toutes les commandes CLI Bicep, consultez commandes CLI Bicep.