Mendekompilasi JSON templat ARM ke Bicep

Artikel ini menjelaskan cara mendekompilasi templat Azure Resource Manager (templat ARM) ke file Bicep. Anda harus memasang Bicep CLI untuk menjalankan perintah konversi.

Catatan

Dari Visual Studio Code, Anda dapat langsung membuat deklarasi sumber daya dengan mengimpor dari sumber daya yang ada. Untuk informasi selengkapnya, lihat perintah Bicep.

Visual Studio Code memungkinkan Anda menempelkan JSON sebagai Bicep. Ini secara otomatis menjalankan perintah dekombinasi. Untuk informasi selengkapnya, lihat Menempelkan JSON sebagai Bicep.

Dekompilasi templat ARM akan membantu Anda memulai pengembangan Bicep. Jika Anda memiliki pustaka templat ARM dan ingin menggunakan Bicep untuk pengembangan yang akan datang, Anda dapat mendekompilasinya ke Bicep. Namun, file Bicep mungkin perlu revisi untuk penerapan praktik terbaik di Bicep.

Artikel ini memperlihatkan cara menjalankan perintah decompile di Azure CLI. Jika Anda tidak menggunakan Azure CLI, jalankan perintah tanpa az di awal perintah. Misalnya, az bicep decompile menjadi bicep decompile.

Dekompilasi dari JSON ke Bicep

Untuk mendekompilasi JSON templat ARM ke Bicep, gunakan:

az bicep decompile --file main.json

Perintah membuat file bernama main.bicep di direktori yang sama dengan main.json. Perintah membuat file bernama main.bicep di direktori yang sama dengan main.json.

Anda juga dapat mendekompilasi JSON templat ARM ke Bicep dari Visual Studio Code dengan menggunakan perintah Dekompilasi ke Bicep. Untuk informasi selengkapnya, lihat Visual Studio Code.

Perhatian

Proses dekompilasi mencoba mengonversi file, tetapi tidak ada pemetaan yang dijamin dari templat ARM JSON ke Bicep. Anda mungkin perlu memperbaiki peringatan dan kesalahan di file Bicep yang dihasilkan. Atau, proses dekompilasi dapat gagal jika konversi yang akurat tidak memungkinkan. Untuk melaporkan masalah atau konversi yang tidak akurat, buat laporan masalah.

Proses dekompilasi dan pembuatan perintah menghasilkan templat yang setara secara fungsi. Namun, penerapannya mungkin tidak sama persis. Mengonversi templat dari JSON ke Bicep dan kemudian kembali ke JSON mungkin menghasilkan templat dengan sintaks yang berbeda dari templat asli. Saat disebarkan, templat yang dikonversi menghasilkan hasil yang sama.

Memperbaiki masalah konversi

Misalkan Anda memiliki templat ARM berikut:

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

Saat Anda mendekompilasi templat ARM, Anda memperoleh:

@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

Hasil file yang didekompilasi, hanya saja nama-nama file mungkin perlu diubah. Variabel var storageAccountName_var memiliki konvensi penamaan yang tidak umum. Mari kita ubah menjadi:

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

Untuk mengganti nama di seluruh file, klik kanan nama, lalu pilih Ganti Nama simbol. Anda juga dapat menggunakan tombol pintas F2 .

Sumber daya memiliki nama simbolis yang mungkin ingin Anda ubah. Daripada storageAccountName sebagai nama simbolik, gunakan exampleStorage.

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

File yang lengkap adalah:

@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

Mengekspor templat dan mengonversi

Anda dapat mengekspor templat untuk grup sumber daya, lalu meneruskannya langsung ke perintah decompile. Contoh berikut menunjukkan cara mendekompilasi templat yang diekspor.

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

Tampilan berdampingan

Bicep Playground memungkinkan Anda melihat templat ARM dan file Bicep yang setara secara berdampingan. Anda dapat memilih Templat Sampel untuk melihat kedua versi. Atau, pilih Decompile untuk mengunggah templat ARM Anda sendiri dan melihat file Bicep yang setara.

Langkah berikutnya

Untuk mempelajari semua perintah CLI Bicep, lihat perintah Bicep CLI.