Compartilhar via


Descompilar um modelo JSON do Azure Resource Manager 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 decompile. 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 um JSON de modelo do ARM para Bicep, use:

az bicep decompile --file main.json

Esse comando cria um arquivo chamado main.bicep no mesmo diretório que 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 JSON de modelo do ARM para Bicep no Visual Studio Code usando o comando Decompile into Bicep no Visual Studio Code. Para obter mais informações, confira Descompilar no Bicep.

Cuidado

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

Os comandos de descompilação e build produzem modelos que são funcionalmente equivalentes. No entanto, eles podem não ser exatamente iguais durante a implementação. Converter um modelo de JSON para Bicep e depois voltar para JSON pode gerar 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. Você pode alterá-lo 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 de um grupo de recursos e passá-lo diretamente para o comando decompile. Os exemplos a seguir mostram 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 exibir modelos do ARM e arquivos Bicep equivalentes lado a lado. Você pode selecionar o Modelo de Exemplo para ver ambas as versões ou selecionar Descompilar para carregar seu próprio modelo do ARM e exibir o arquivo Bicep equivalente.

Próximas etapas

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