Como descompilar o modelo do ARM JSON para Bicep

Este artigo descreve como descompilar modelos do ARM (modelos do Azure Resource Manager) para arquivos Bicep. Você deve ter a CLI do Bicep instalada para executar os comandos de conversão.

Observação

No Visual Studio Code, você pode criar declarações de recurso importando de recursos existentes. Para saber mais, confira Comandos do Bicep.

O Visual Studio Code permite colar um JSON como Bicep. Ele executa automaticamente o comando de descompilação. Para saber mais, confira Colar um JSON como Bicep.

A descompilação de um modelo do ARM ajuda você a começar a usar o desenvolvimento no Bicep. Se você tiver uma biblioteca de modelos do ARM e quiser usar o Bicep para desenvolvimento futuro, descompile-os para Bicep. No entanto, talvez o arquivo Bicep precise de revisões para implementar as melhores práticas do Bicep.

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

Descompilação de JSON para Bicep

Para descompilar o modelo do ARM JSON para Bicep, use:

az bicep decompile --file main.json

O comando cria um arquivo chamado main.bicep no mesmo diretório main.json. Se main.bicep existir no mesmo diretório, use a opção --force para substituir o arquivo Bicep existente.

Você também pode descompilar o modelo do ARM JSON para Bicep do Visual Studio Code usando o comando Descompilar no Bicep. Para obter mais informações, confira Visual Studio Code.

Cuidado

A descompilação tenta converter o arquivo, mas não há nenhum mapeamento garantido do modelo do ARM JSON para Bicep. Talvez seja necessário corrigir os avisos e os erros no arquivo Bicep gerado. Ou, então, a descompilação poderá falhar se uma conversão precisa não for possível. Para relatar problemas ou conversões imprecisas, crie um problema.

Os comandos de descompilação e build produzem modelos que são funcionalmente equivalentes. No entanto, eles podem não ser exatamente iguais na implementação. Converter um modelo de JSON em Bicep e, em seguida, voltar para JSON provavelmente resultará em um modelo com sintaxe diferente do modelo original. Quando implantado, os modelos convertidos produzem os mesmos resultados.

Corrigir problemas de conversão

Suponha que você tenha o seguinte modelo do 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": "2023-04-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],
  "outputs": {
    "storageAccountName": {
      "type": "string",
      "value": "[variables('storageAccountName')]"
    }
  }
}

Ao descompilá-lo, você 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 = 'store${uniqueString(resourceGroup().id)}'

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {}
}

output storageAccountName string = storageAccountName

O arquivo descompilado funciona, mas tem alguns nomes que talvez você queira alterar. A variável var storageAccountName_var tem uma convenção de nomenclatura incomum. Vamos mudar isso para:

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

Para renomear o arquivo, clique com o botão direito do mouse no nome e selecione Renomear símbolo. Você também pode usar a tecla de atalho F2.

O recurso tem um nome simbólico que talvez você queira alterar. Em vez de storageAccountName para o nome simbólico, use exampleStorage.

resource exampleStorage 'Microsoft.Storage/storageAccounts@2023-04-01' = {

O arquivo 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@2023-04-01' = {
  name: uniqueStorageName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {}
}

output storageAccountName string = uniqueStorageName

Exportar modelo e converter

Você pode exportar o modelo para um grupo de recursos e transmiti-lo diretamente para o comando decompile. O exemplo a seguir mostra como descompilar um modelo exportado.

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

Visão lado a lado

O Playground do Bicep permite que você veja o modelo do ARM equivalente e os arquivos Bicep lado a lado. Você pode selecionar um modelo de exemplo para ver as duas versões. Ou, então, selecione Descompilar para carregar seu modelo do ARM e ver o arquivo Bicep equivalente.

Próximas etapas

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