テンプレートにおける JSON と Bicep の比較

この記事では、Azure Resource Manager テンプレート (ARM テンプレート) に関する Bicep 構文と JSON 構文を比較します。 ほとんどの場合、Bicep 構文は、JSON の同等のものより詳細度が低くなります。

JSON を使用した ARM テンプレートの開発に慣れている場合は、次の例を使用して、Bicep の同等の構文について確認してください。

完全なファイルを比較する

Bicep Playground では、Bicep と同等の JSON を並べて表示できます。 同じインフラストラクチャの実装を比較することができます。

たとえば、SQL サーバーとデータベースをデプロイするファイルを表示できます。 Bicep は、ARM テンプレートの約半分のサイズです。

サイド バイ サイド テンプレートのスクリーンショット

式を作成するには:

func()
"[func()]"

パラメーター

パラメーターを既定値で宣言するには:

param orgName string = 'Contoso'
"parameters": {
  "orgName": {
    "type": "string",
    "defaultValue": "Contoso"
  }
}

パラメーター値を取得するには、定義した名前を使用します。

name: orgName
"name": "[parameters('orgName'))]"

変数

変数を宣言するには:

var description = 'example value'
"variables": {
  "description": "example value"
},

変数値を取得するには、定義した名前を使用します。

workloadSetting: description
"workloadSetting": "[variables('description'))]"

文字列

文字列を連結するには:

name: '${namePrefix}-vm'
"name": "[concat(parameters('namePrefix'), '-vm')]"

論理演算子

論理 AND を返すには:

isMonday && isNovember
[and(parameter('isMonday'), parameter('isNovember'))]

条件付きで値を設定するには:

isMonday ? 'valueIfTrue' : 'valueIfFalse'
[if(parameters('isMonday'), 'valueIfTrue', 'valueIfFalse')]

デプロイのスコープ

デプロイのターゲット範囲を設定するには:

targetScope = 'subscription'
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#"

リソース

リソースを宣言するには:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2020-06-01",
    ...
  }
]

リソースを条件付きでデプロイするには:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2023-03-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2023-03-01",
    ...
  }
]

リソース プロパティを設定するには:

sku: '2016-Datacenter'
"sku": "2016-Datacenter",

テンプレート内のリソースのリソース ID を取得するには:

nic1.id
[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]

ループ

配列またはカウント内の項目を繰り返すには:

[for storageName in storageAccountNames: {
  ...
}]
"copy": {
  "name": "storagecopy",
  "count": "[length(parameters('storageAccountNames'))]"
},
...

リソースの依存関係

Bicep では、明示的な依存関係を設定できますが、この方法は推奨されません。 代わりに、暗黙的な依存関係に依存します。 あるリソース宣言が別のリソースの識別子を参照している場合は、暗黙的な依存関係が作成されます。

ネットワーク セキュリティ グループに暗黙的な依存関係があるネットワーク インターフェイスを次に示します。 netSecurityGroup.id で、ネットワーク セキュリティ グループを参照します。

resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2022-11-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2022-11-01' = {
  name: nic1Name
  location: location
  properties: {
    ...
    networkSecurityGroup: {
      id: netSecurityGroup.id
    }
  }
}

明示的な依存関係を設定する必要がある場合は、次のように指定します。

dependsOn: [ storageAccount ]
"dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', 'parameters('storageAccountName'))]"]

参照リソース

テンプレート内のリソースからプロパティを取得するには:

storageAccount.properties.primaryEndpoints.blob
[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]

テンプレートにデプロイされていない既存のリソースからプロパティを取得するには:

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' existing = {
  name: storageAccountName
}

// use later in template as often as needed
storageAccount.properties.primaryEndpoints.blob
// required every time the property is needed
"[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"

Bicep では、入れ子になったアクセサー (::) を使用して、親リソース内で入れ子になったリソースのプロパティを取得します。

VNet1::Subnet1.properties.addressPrefix

JSON の場合は、参照関数を使用します。

[reference(resourceId('Microsoft.Network/virtualNetworks/subnets', variables('subnetName'))).properties.addressPrefix]

出力

テンプレート内のリソースからプロパティを出力するには:

output hostname string = publicIP.properties.dnsSettings.fqdn
"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

条件付きで値を出力するには:

output hostname string = condition ? publicIP.properties.dnsSettings.fqdn : ''
"outputs": {
  "hostname": {
    "condition": "[variables('condition')]",
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  }
}

Bicep の三項演算子は、条件プロパティではなく、ARM テンプレート JSON の if 関数に相当します。 三項構文は、1 つまたは別の値に評価される必要があります。 上記のサンプルで条件が false の場合、Bicep では空の文字列を含むホスト名が出力されますが、JSON では値が出力されません。

コードの再利用

ソリューションを複数のファイルに分割するには:

次の手順