Bicep への ARM テンプレート JSON の逆コンパイル

この記事では、Azure Resource Manager テンプレート (ARM テンプレート) を Bicep ファイルに逆コンパイルする方法について説明します。 変換コマンドを実行するには、Bicep CLI がインストールされている必要があります。

注意

Visual Studio Code で、既存のリソースからインポートすることにより、リソースの宣言を直接作成できます。 詳しくは、「Bicep コマンド」をご覧ください。

Visual Studio Code を使用すると、JSON を Bicep として貼り付けることができます。 逆コンパイル コマンドが自動的に実行されます。 詳細については、JSON を Bicep として貼り付けるに関するページを参照してください。

ARM テンプレートの逆コンパイルは、Bicep の開発を開始するうえで役立ちます。 ARM テンプレートのライブラリがあり、今後の開発に Bicep を使用する場合は、Bicep に逆コンパイルすることができます。 しかし、Bicep ファイルには、Bicep のベスト プラクティスを実装するためのリビジョンが必要になる場合があります。

この記事では、Azure CLI で decompile コマンドを実行する方法を示します。 Azure CLI を使用しない場合は、コマンドの先頭に az を指定せずにコマンドを実行します。 たとえば、az bicep decompilebicep decompile にします。

JSON から Bicep に逆コンパイルする

ARM テンプレート JSON を Bicep に逆コンパイルするには、以下を使用します。

az bicep decompile --file main.json

このコマンドでは、main.json と同じディレクトリに main.bicep という名前のファイルを作成します。 main.bicep が同じディレクトリに存在する場合は、--force スイッチを使用して既存の Bicep ファイルを上書きします。

また、Visual Studio Code から Bicep に ARM テンプレート JSON を逆コンパイルするには、Bicep への逆コンパイルコマンドを使用します。 詳しくは、Visual Studio Code に関するページをご覧ください。

注意

逆コンパイルではファイルの変換が試行されますが、ARM テンプレート JSON から Bicep へのマッピングは保証されていません。 生成された Bicep ファイルの警告とエラーの修正が必要になる場合があります。 または、正確な変換ができない場合、逆コンパイルに失敗するおそれがあります。 問題または不正確な変換を報告するには、イシューを作成します

decompile と build コマンドにより、機能的に同等のテンプレートが生成されます。 ただし、実装がまったく同じであるとは限りません。 テンプレートを JSON から Bicep に変換した後、JSON に再変換すると、元のテンプレートとは構文が異なったテンプレートになる可能性があります。 デプロイすると、変換されたテンプレートは同じ結果を生成します。

変換に関する問題を修正する

次の 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')]"
    }
  }
}

逆コンパイルすると、次のようになります。

@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

逆コンパイルされたファイルは動作しますが、変更が必要になる場合がある名前がいくつかあります。 変数 var storageAccountName_var には、通常とは異なる名前付け規則があります。 これを次のように変更してみましょう。

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

ファイル全体で名前を変更するには、名前を右クリックし、[シンボルの名前変更] を選択します。 F2 ホットキーを使用することもできます。

リソースには、変更が必要になる場合があるシンボル名があります。 シンボル名の storageAccountName の代わりに、exampleStorage を使用します。

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

完全なファイルは次のとおりです。

@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

テンプレートをエクスポートして変換する

リソース グループのテンプレートをエクスポートしてから、それを decompile コマンドに直接渡すことができます。 次の例は、エクスポートされたテンプレートを逆コンパイルする方法を示しています。

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

横に並べて表示

Bicep Playground を使うと、同等の ARM テンプレートと Bicep ファイルを横に並べて表示できます。 [サンプル テンプレート] を選ぶと、両方のバージョンを表示できます。 または、[逆コンパイル] を選んで、独自の ARM テンプレートをアップロードし、同等の Bicep ファイルを表示します。

次のステップ

すべての Bicep CLI コマンドの詳細については、「BICEP CLI コマンド」を参照してください。