Decompilar o JSON do modelo do ARM para Bicep

Este artigo descreve como decompilar modelos do Azure Resource Manager (modelos arm) em ficheiros Bicep. Tem de ter a CLI do Bicep instalada para executar os comandos de conversão.

Nota

A partir do Visual Studio Code, pode criar diretamente declarações de recursos ao importar a partir de recursos existentes. Para obter mais informações, veja Comandos do Bicep.

O Visual Studio Code permite-lhe colar JSON como Bicep. Executa automaticamente o comando de decompilação. Para obter mais informações, veja Colar JSON como Bicep.

Decompilar um modelo do ARM ajuda-o a começar a desenvolver o Bicep. Se tiver uma biblioteca de modelos do ARM e quiser utilizar o Bicep para desenvolvimento futuro, pode decompilá-los com o Bicep. No entanto, o ficheiro Bicep poderá precisar de revisões para implementar as melhores práticas do Bicep.

Este artigo mostra como executar o comando na CLI do decompile Azure. Se não estiver a utilizar a CLI do Azure, execute o comando sem az no início do comando. Por exemplo, az bicep decompile torna-se bicep decompile.

Decompilar de JSON para Bicep

Para descompilar o JSON do modelo arm para Bicep, utilize:

az bicep decompile --file main.json

O comando cria um ficheiro com o nome main.bicep no mesmo diretório que main.json. Se o ficheiro main.bicep existir no mesmo diretório, utilize o comutador --force para substituir o ficheiro Bicep existente.

Também pode descompilar o modelo do ARM JSON para Bicep a partir do Visual Studio Code com o comando Decompilar em Bicep . Para obter mais informações, veja Visual Studio Code.

Atenção

A descompilação tenta converter o ficheiro, mas não há mapeamento garantido do modelo do ARM JSON para Bicep. Poderá ter de corrigir avisos e erros no ficheiro Bicep gerado. Em alternativa, a descompilação pode falhar se não for possível uma conversão precisa. Para comunicar quaisquer problemas ou conversões imprecisas, crie um problema.

Os comandos de decompilação e compilação produzem modelos funcionalmente equivalentes. No entanto, podem não ser exatamente os mesmos na implementação. Converter um modelo de JSON em Bicep e, em seguida, voltar a JSON provavelmente resulta num modelo com sintaxe diferente do modelo original. Quando implementados, os modelos convertidos produzem os mesmos resultados.

Corrigir problemas de conversão

Suponha que tem o seguinte modelo arm:

{
  "$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')]"
    }
  }
}

Quando o decompila, obtém:

@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

O ficheiro decomposto funciona, mas tem alguns nomes que poderá querer alterar. A variável var storageAccountName_var tem uma convenção de nomenclatura invulgar. Vamos alterá-lo para:

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

Para mudar o nome no ficheiro, clique com o botão direito do rato no nome e, em seguida, selecione Mudar o nome do símbolo. Também pode utilizar a tecla de atalho F2 .

O recurso tem um nome simbólico que poderá querer alterar. Em vez de storageAccountName para o nome simbólico, utilize exampleStorage.

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

O ficheiro completo é:

@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

Exportar modelo e converter

Pode exportar o modelo para um grupo de recursos e, em seguida, transmiti-lo diretamente para o decompile comando . O exemplo seguinte mostra como decompilar um modelo exportado.

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

Vista lado a lado

O Bicep Playground permite-lhe ver ficheiros bicep e modelo do ARM equivalentes lado a lado. Pode selecionar Modelo de Exemplo para ver ambas as versões. Em alternativa, selecione Decompilar para carregar o seu próprio modelo do ARM e ver o ficheiro Bicep equivalente.

Passos seguintes

Para saber mais sobre todos os comandos da CLI do Bicep, veja Comandos da CLI do Bicep.