Partilhar via


Descompilando modelo ARM JSON para Bicep

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

Nota

No Visual Studio Code, você pode criar diretamente declarações de recursos importando de recursos existentes. Para obter mais informações, consulte Comandos do bíceps.

O Visual Studio Code permite que você cole JSON como Bicep. Ele executa automaticamente o comando decompile. Para obter mais informações, consulte Colar JSON como Bicep.

Descompilar um modelo ARM ajuda você a começar com o desenvolvimento do Bicep. Se você tiver uma biblioteca de modelos ARM e quiser usar o Bicep para desenvolvimento futuro, poderá descompilá-los para o Bicep. No entanto, o arquivo Bicep pode precisar de revisões para implementar as práticas recomendadas para o Bicep.

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

Descompilar de JSON para Bicep

Para descompilar o modelo ARM JSON para Bicep, use:

az bicep decompile --file main.json

O 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 o modelo ARM JSON para Bicep do Visual Studio Code usando o comando Decompile into Bicep . Para obter mais informações, consulte Visual Studio Code.

Atenção

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

Os comandos decompile e build produzem modelos que são funcionalmente equivalentes. No entanto, eles podem não ser exatamente os mesmos na implementação. Converter um modelo de JSON para Bicep e depois de volta para JSON provavelmente resulta em um modelo com sintaxe diferente do modelo original. Quando implantados, os modelos convertidos produzem os mesmos resultados.

Corrigir problemas de conversão

Suponha que você tenha 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')]"
    }
  }
}

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_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 arquivo descompilado funciona, mas tem alguns nomes que você pode querer alterar. A variável var storageAccountName_var tem uma convenção de nomenclatura incomum. 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. Você também pode usar a tecla de atalho F2 .

O recurso tem um nome simbólico que você pode querer alterar. Em vez do storageAccountName nome simbólico, use exampleStorage.

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

O processo 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

Você pode exportar o modelo para um grupo de recursos e, em seguida, passá-lo diretamente para o decompile comando. 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

Vista lado a lado

O Bicep Playground permite que você visualize modelos ARM equivalentes e arquivos Bicep lado a lado. Você pode selecionar Modelo de exemplo para ver ambas as versões. Ou selecione Descompilar para carregar seu próprio modelo ARM e visualizar o arquivo Bicep equivalente.

Próximos passos

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